我的设置:NetBeans 8.0.2JEE7 与 EJB3.2 运行在 Glassfish 4.2 上
嗨,我开始了一个定时服务
@Schedule(second = "*/10", minute = "*", hour = "*", persistent = false)
public void chronJobSySODate() {
System.out.println("Timer event: " + new Date());
}
我在另一个带有@PostConstruct注释的 Bean 中调用了此方法
@PostConstruct
public void startChronJob(){
chronJobBean.chronJobSySODate();
}
现在,尽管由于persistent = false
计时器在杀死Glassfish后会消失,但它仍然存在,即使在运行在同一Glassfish服务器上的其他NetBeans项目中也是如此。
我已经看过这个堆栈溢出线程有没有办法在运行时停止/重新启动 ejb 3.1 自动计时器?
所以我尝试了
import javax.annotation.Resource;
import javax.ejb.TimerService;
@Resource
TimerService timerService;
public void cancelAllTimers() {
System.out.println("cancelAllTimers");
for (Timer timer : timerService.getTimers()) {
System.out.println("Canceling Timer: info: " + timer.getInfo());
timer.cancel();
}
}
但是关于 timerService 变量,没有计时器(但计时器直到运行。
这是否解决了您的问题,但由于我尚未被允许发表评论(<50 次),我将其作为答案发布:
你应该省略在PostConstruct中对计时器方法的调用。用@Schedule注释的方法由容器执行,无需任何进一步注册。由于您没有发布"呼叫者"类的其余部分,因此我不得不猜测:如果它是标记为@Startup或使用的 EJB,则即使没有活动的计时器,也会调用计时器方法。