http://computer.mblogger.cn/sammi_tea
http://www.weste.net/html/200310/20031029QBI124658.html
使用Timer Service 可以在某一指定時間到了,或周期性Schedule開始時,通知EJB執行指定操作。為了使用Timer Service,EJB需要實現javax.ejb.TimedObject接口。
public interface TimedObject {
public void ejbTimeout(Timer timer) ;
}
例如:當時間到,EntityBean執行數據更新操作
public abstract class ShipBean implements javax.ejb.EntityBean, javax.ejb.TimedOut {
javax.ejb.EntityContext ejbContext;
public void setEntityContext(javax.ejb.EntityContext ctxt){
ejbContext = ctxt;
}
public void ejbTimedout(javax.ejb.Timer timer) {
// business logic for timer goes here
}
。。。。
從上面的使用例子看ejbTimedout是一個回調方法,執行具體的商業邏輯,那么怎樣設置什么時間觸發這個方法呢,我們利用javax.ejb.TimerSevice。該對象我們可以從EJBContext中獲得該對象實例。為此我們在上面的例子中添加一個ejbHome方法scheduleMaintenance。
public inteface ShipBeanHome implements javax.ejb.EJBHome {
ShipBeanRemote create() throws CreateException, RemoteException;
void scheduleMaintenance(String desc, Date scheduleDate) throws RemoteException;
……
}
public abstract class ShipBean implements javax.ejb.EntityBean, javax.ejb.TimedOut {
javax.ejb.EntityContext ejbContext;
public void setEntityContext(javax.ejb.EntityContext ctxt){
ejbContext = ctxt;
}
public void ejbScheduleMaintenance(String desc, Date scheduleDate) {
TimerService service = ejbContext.getTimerService();
Service.createTime(scheduleDate, desc);
}
public void ejbTimedout(javax.ejb.Timer timer) {
// business logic for timer goes here
}
在TimerService中提供了設置了Timer的方法,包括設置一個時間點(ejbTimedOut方法運行一次)和時間間隔(ejbTimedOut方法運行多次)。另外,它還提供了getTimer()的方法,該方法返回一個Collection,里面包含了已經注冊了的所有Timer對象。
Timer接口
public interface Timer {
// Cause the timer and all its associated expiration notifications to be canceled
public void cancel()
throws IllegalStateException,NoSuchObjectLocalException,EJBException;
// Get the information associated with the timer at the time of creation.
public java.io.Serializable getInfo()
throws IllegalStateException,NoSuchObjectLocalException,EJBException;
// Get the point in time at which the next timer expiration is scheduled to occur.
public java.util.Date getNextTimeout()
throws IllegalStateException,NoSuchObjectLocalException,EJBException;
// Get the number of milliseconds that will elapse before the next scheduled timer expiration
public long getTimeRemaining()
throws IllegalStateException,NoSuchObjectLocalException,EJBException;
//Get a serializable handle to the timer.
public TimerHandle getHandle()
throws IllegalStateException,NoSuchObjectLocalException,EJBException;
}
Cancel方法用來取消一個已經無效的Timer(時間點已經過去)。
GetInfo方法獲得一個Timer的相關信息,這些信息在createTimer時作為參數和Timer聯系在一起。在前面的例子中,為了防止客戶胡亂調用ejbHome方法scheduleMaintenance,我們可以為每一個設定的時間添加一個唯一編號。修改后的代碼如下:
public class MaintenanceItem implements java.io.Serializable {
private long maintenanceItemNumber;
private String description;
public MaintenanceItem(long min, String desc){
maintenanceItemNumber = min;
description = desc;
}
public long getMIN(){
return maintenanceItemNumber;
}
public String getDescription(){
return description;
}
public void scheduleMaintenance(MaintenanceItem maintenanceItem, Date dateOfTest){
TimerService timerService = ejbContext.getTimerService();
java.util.Iterator timers = timerService.getTimers().iterator();
while( timers.hasNext() ){
javax.ejb.Timer timer = (javax.ejb.Timer) timers.next();
String timerMainItem = (MaintenanceItem) timer.getInfo();
if( maintenanceItem.getMIN() == timerMainItem.getMIN() )
timer.cancel();
}
}
timerService.createTimer( dateOfText, maintenanceItem);
}
TimerService的Transaction
TimerService可以參與Transaction,當createTimer如果在Transaction中,如果該transaction rollback則創建的Timer也會取消。