在单例bean的生命周期回调中取消计时器

时间:2018-01-18 01:08:31

标签: java java-ee timer ejb wildfly

我有一个运行Wildfly 10.1 Final的Java EE项目。

我正在使用javax.ejb.TimerService以编程方式创建一些计时器:

timerService.createTimer(new Date(), null);

现在,我试图在下次部署项目时取消这些计时器,因为每次重新部署项目或重新启动服务器时它们仍然存在。

我尝试使用Singleton Startup bean,如下所示:

@Startup
@Singleton
public class TimerKiller {

    @PostConstruct
    public void killTimers() {
        timerService.getAllTimers().forEach(timer -> timer.cancel());
    }

    @Resource
    TimerService timerService;
}

但是,我得到一个例外:

  

java.lang.IllegalStateException:WFLYEJB0325:无法调用计时器   生命周期中非单例bean回调的服务方法

这是堆栈跟踪中的最后一个异常(最后一次引发)。

我似乎无法理解这是什么意思。我试过谷歌搜索但没有出现。

1 个答案:

答案 0 :(得分:2)

您使用的是javax.ejb.Singleton还是javax.inject.Singleton?确保您使用的是javax.ejb.Singleton

你也可以使用例如SingleActionTimer并将其指定为非持久性:

TimerConfig tc = new TimerConfig(null, false);
timerService.createSingleActionTimer(new Date(), tc);