http://computer.mblogger.cn/sammi_tea
http://www.weste.net/html/200310/20031029QBI124658.html
使用Timer Service 可以在某一指定時(shí)間到了,或周期性Schedule開(kāi)始時(shí),通知EJB執(zhí)行指定操作。為了使用Timer Service,EJB需要實(shí)現(xiàn)javax.ejb.TimedObject接口。
public interface TimedObject {
public void ejbTimeout(Timer timer) ;
}
例如:當(dāng)時(shí)間到,EntityBean執(zhí)行數(shù)據(jù)更新操作
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是一個(gè)回調(diào)方法,執(zhí)行具體的商業(yè)邏輯,那么怎樣設(shè)置什么時(shí)間觸發(fā)這個(gè)方法呢,我們利用javax.ejb.TimerSevice。該對(duì)象我們可以從EJBContext中獲得該對(duì)象實(shí)例。為此我們?cè)谏厦娴睦又刑砑右粋€(gè)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中提供了設(shè)置了Timer的方法,包括設(shè)置一個(gè)時(shí)間點(diǎn)(ejbTimedOut方法運(yùn)行一次)和時(shí)間間隔(ejbTimedOut方法運(yùn)行多次)。另外,它還提供了getTimer()的方法,該方法返回一個(gè)Collection,里面包含了已經(jīng)注冊(cè)了的所有Timer對(duì)象。
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方法用來(lái)取消一個(gè)已經(jīng)無(wú)效的Timer(時(shí)間點(diǎn)已經(jīng)過(guò)去)。
GetInfo方法獲得一個(gè)Timer的相關(guān)信息,這些信息在createTimer時(shí)作為參數(shù)和Timer聯(lián)系在一起。在前面的例子中,為了防止客戶胡亂調(diào)用ejbHome方法scheduleMaintenance,我們可以為每一個(gè)設(shè)定的時(shí)間添加一個(gè)唯一編號(hào)。修改后的代碼如下:
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,當(dāng)createTimer如果在Transaction中,如果該transaction rollback則創(chuàng)建的Timer也會(huì)取消。