我们有以下简单的应用程序:一个@singleton bean,带有@TimeOut方法和一个启动计时器的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教程:使用计时器服务。
如果您不需要计时器持久,则希望使用@Schedule
并设置persistent=false
。或尝试自行控制计时器生命周期的程序化方法。