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

标签 java jakarta-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;
}

但是,我遇到了一个异常(exception):

java.lang.IllegalStateException: WFLYEJB0325: Cannot invoke timer service methods in lifecycle callback of non-singleton beans

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

我似乎不明白这是什么意思。我尝试用谷歌搜索但没有任何结果。

最佳答案

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

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

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

关于java - 在单例bean的生命周期回调中取消计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48312400/

相关文章:

c# - 在 C# 中使用计时器实现循环

java - 如何获取字符串中的单词?

java - 什么等同于 Java World 中的 PHP Zend Framework

ios - Objective C - 使用 Singleton 的不间断计时器

Javascript 倒数计时器

jsf - 使用 JEE6 将 EJB 注入(inject) JSF 转换器

java - 为什么我的物体朝错误的方向移动?

java - 如何从文件中读取二维数组索引(IE : Coords) in java

java - 如何重新加载从线程加载数据的recycleview

java - ArrayList 错误,应用程序崩溃