我们有以下简单的应用程序:一个带有@Timeout方法的@Singleton bean和一个启动计时器的servlet。在第一次部署之后,我们看到该方法在2秒内被调用一次 - 这是预期的。然后在热重新部署后,我们看到该方法在2秒内被调用两次。经过一些重新部署后,在同一个2秒内多次调用方法。重新启动服务器没有帮助。请参阅以下代码:
import javax.ejb.*;
@Remote(TimerRemote.class)
@Singleton
public class TimerBean implements TimerRemote {
@Resource
private SessionContext context;
public void startTimer() {
context.getTimerService().createTimer(2000,2000,null);
}
@Timeout
public void timeoutCallback(javax.ejb.Timer timer) {
System.out.println("timeoutCallback is called: " + timer);
}
}
应在给定的间隔时间后调用@Timeout方法。目前,方法在一秒钟内被多次调用。
定时器默认是持久的,根本不会被取消。
请参考官方Java EE6 Tutorial: Using the Timer Service。
如果你不需要定时器来持久,则更喜欢使用@Schedule
并设置persistent=false
。或者尝试以自己的方式控制计时器生命周期的程序化方法。