摘要
EJB Timer Service是一个由EJB容器管理的定时器服务程序。
EJB Timer Service是让用户可以基于时间调度表调用指定的程序,这种服务是由容器管理的。它可以指定事件在某一个时间点触发,也可以指定事件过多长时间然后触发,还可以指定事件以某个固定的周期来触发,这解决了在EJB容器内部几种Bean不能用多线程来达到类似功能的困难。
EJB Timer Service是一个粗粒度的时间点触发服务,它只能提供应用程序级别的时间调度和时间触发服务,不能用于精确度很高的实时系统的时间精度要求。
同时EJB Timer Service是一个可靠的、事务性的服务。
TimerService接口
TimedObject接口
Timer接口
TimerHandle接口
TimerService的实现对象从EJBContext接口的实现获得,方法为getTimerService。TimerService接口定义了如下方法:
public interface javax.ejb.TimerService {
public Timer createTimer(long duration,
java.io.Serializable info);
public Timer createTimer(long initialDuration,
long intervalDuration, java.io.Serializable info);
public Timer createTimer(java.util.Date expiration,
java.io.Serializable info);
public Timer createTimer(java.util.Date initialExpiration,
long intervalDuration, java.io.Serializable info);
public Collection getTimers();
}info参数用来标识时间到期的意义和描述
getTimers返回和当前Enterprise Bean相关的Timers
商务逻辑实现bean对象需要实现的接口,该接口的 ejbTimeout 方法用来供Timer到期时进行回调。
public interface javax.ejb.TimedObject {
public void ejbTimeout(Timer timer);
}该接口定义用来获得Timer对象。
public interface javax.ejb.TimerHandle extends java.io.Serializable{
public javax.ejb.Timer getTimer();
}当一个bean的相关时间点到达的时候,容器将会调用该对象的ejbTimeout()方法,方法中,开发人员可以将需要执行的内容写在这个方法内。
stateless session bean、 message-driven bean、entity bean可以在定时器中登记,然后定时器在一定的时间点触发,记住:statefull session bean不能实现TimedObject接口。
从context对象获取TimerService对象
TimerService timerService = context.getTimerService(); Timer timer = timerService.createTimer(intervalDuration, "created timer");
Timer是持久性的,假如应用服务器关机,当应用服务器重新启动时,Timer将被重新激活。
createTimer方法Date和long类型的参数表示到毫秒级的精度,但是Timer不是为实时系统提供的,所以它触发的精度可能不能达到精确的毫秒级,对于普通的应用程序,它的精度已经足够。
使用Timer的Bean必须实现javax.ejb.TimedObject接口,javax.ejb.TimedObject接口只有一个ejbTimeout()方法,该方法就是事件到期时触发的方法,需要把Timer需要执行的商业逻辑放在该方法面里。例如:
public class TimerSessionBean implements SessionBean, TimedObject {
private SessionContext context;
public TimerSessionBean() {
}
public void myCreateTimer(long intervalDuration) {
System.out.println("TimerSessionBean: start createTimer ");
TimerService timerService = context.getTimerService();
Timer timer =
timerService.createTimer(intervalDuration, "created timer");
}
public void ejbTimeout(Timer timer) {
System.out.println("TimerSessionBean: ejbTimeout ");
}
public void setSessionContext(SessionContext sc) {
System.out.println("TimerSessionBean: setSessionContext");
context = sc;
}
public void ejbCreate() {
System.out.println("TimerSessionBean: ejbCreate");
}
public void ejbRemove() {
}
public void ejbActivate() {
}
public void ejbPassivate() {
}
}Timer可以由以下几种方式取消:
当一个单事件的Timer到期时,EJB容器调用完ejbTimeout方法后取消Timer
当entity bean的实例被移除时,EJB容器取消和被移除实例相关的Timer
当调用Timer的cancel方法时,EJB容器取消Timer
除了cancel 和 getHandle 方法之外,Timer接口还定义了一些其它方法来获得Timer的部分信息
public long getTimeRemaining(); public java.util.Date getNextTimeout(); public java.io.Serializable getInfo();
getInfo方法返回调用createTimer方法时最后一个参数的值。