【问题标题】:Cancel TimerService started with @Schedule取消使用 @Schedule 启动的 TimerService
【发布时间】:2015-01-11 21:25:55
【问题描述】:

我的设置: NetBeans 8.0.2 在 Glassfish 4.2 上运行 EJB3.2 的 JEE7

你好,我启动了一个定时器服务

@Schedule(second = "*/10", minute = "*", hour = "*", persistent = false)
public void chronJobSySODate() {
    System.out.println("Timer event: " + new Date());

}

我在另一个 Bean 中使用 @PostConstruct 注解调用了这个方法

@PostConstruct
public void startChronJob(){
    chronJobBean.chronJobSySODate();
}

尽管我现在虽然因为persistent = false 而杀死 Glassfish 后计时器会消失,但即使在同一 Glassfish 服务器上运行的其他 NetBeans 项目中,它仍然存在。

我已经看过这个 StackOverflow 线程 Is there a way to stop/re-start ejb 3.1 automatic timer during runtime?

所以我尝试了

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 变量,没有计时器(但计时器一直在运行。

【问题讨论】:

    标签: jakarta-ee timer ejb


    【解决方案1】:

    我不知道这是否能解决您的问题,但由于我还不允许发表评论(

    您应该在 PostConstruct 中省略对计时器方法的调用。 使用 @Schedule 注释的方法由容器执行,无需任何进一步的注册。 由于您没有发布其余的“呼叫者”课程,我不得不猜测: 如果它是一个标记为 @Startup 的 EJB,或者使用了其他方式,即使没有活动的计时器,也会调用您的计时器方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 2020-01-04
      • 2016-12-30
      • 2015-08-09
      相关资源
      最近更新 更多