【问题标题】:Wildfly Scheduled EJB- executes multiple timesWildfly Scheduled EJB - 执行多次
【发布时间】:2015-06-17 14:12:30
【问题描述】:

我创建了一个包含 EJB 的测试应用程序,它应该每秒打印当前时间戳。现在,在我的 wildfly 上部署 Web 应用程序后,我每秒收到大约 5 条日志消息……看起来有多个调度程序正在运行,这会触发输出……

您有什么想法,如何解决?如果我只是用@Schedule 注释方法,它会每秒打印一次结果,但是通过以编程方式设置计时器会产生问题:

@Singleton
@Startup
public class Scheduler {

    @Resource
    TimerService timerService;

    @Inject
    Logger logger;

    @Timeout
    public void doStuff() {
        logger.info("Programmatic Scheduler: " + System.currentTimeMillis());
    }

    @PostConstruct
    public void startScheduler() {

        TimerConfig timerConfig = new TimerConfig();
        timerConfig.setPersistent(false);

        ScheduleExpression expression = new ScheduleExpression();
        expression.second("*/1").minute("*").hour("*");
        timerService.createCalendarTimer(expression, timerConfig);
    }
}

...这是输出 - 你看,每秒打印多个:

    16:26:46,574 INFO  [de.hays.liferay.schedulerprogrammatically.Scheduler] (EJB default - 10) Programmatic Scheduler: 143455120657
    16:26:46,849 INFO  [de.hays.liferay.schedulerprogrammatically.Scheduler] (EJB default - 8) Programmatic Scheduler: 1434551206849
    16:26:46,869 INFO  [de.hays.liferay.schedulerprogrammatically.Scheduler] (EJB default - 7) Programmatic Scheduler: 1434551206869
    16:26:46,890 INFO  [de.hays.liferay.schedulerprogrammatically.Scheduler] (EJB default - 4) Programmatic Scheduler: 1434551206890
    16:26:47,083 INFO  [de.hays.liferay.schedulerprogrammatically.Scheduler] (EJB default - 3) Programmatic Scheduler: 1434551207083
    16:26:47,145 INFO  [de.hays.liferay.schedulerprogrammatically.Scheduler] (EJB default - 1) Programmatic Scheduler: 1434551207145
    16:26:47,185 INFO  [de.hays.liferay.schedulerprogrammatically.Scheduler] (EJB default - 9) Programmatic Scheduler: 1434551207185
    16:26:47,246 INFO  [de.hays.liferay.schedulerprogrammatically.Scheduler] (EJB default - 6) Programmatic Scheduler: 1434551207246
    16:26:47,274 INFO  [de.hays.liferay.schedulerprogrammatically.Scheduler] (EJB default - 2) Programmatic Scheduler: 1434551207274
    16:26:47,489 INFO  [de.hays.liferay.schedulerprogrammatically.Scheduler] (EJB default - 5) Programmatic Scheduler: 1434551207489

【问题讨论】:

    标签: java ejb wildfly


    【解决方案1】:

    我知道了——我用 java 任务控制查找了 wildfly 上正在运行的定时器——并且有不止一个定时器。

    所以我编辑了我的代码,杀死应用程序的所有现有计时器,然后创建一个计时器,以确保真的只有一个计时器:

    @PostConstruct
    public void startScheduler() {
    
        TimerService timerService = sessionContext.getTimerService();
    
        logger.info("Current running timers: {}", timerService.getTimers().toString());
    
        for (Timer t : timerService.getTimers()) {
            t.cancel();
            logger.info("killed the timer service: {}", t);
        }
    
        TimerConfig timerConfig = new TimerConfig();
        timerConfig.setPersistent(false);
    
        Timer createdIntervalTimer = sessionContext.getTimerService().createIntervalTimer(0, 5000, timerConfig);
        logger.info("Created new Timer: {}", createdIntervalTimer);
    
    }
    

    【讨论】:

      【解决方案2】:

      您没有显示您的包导入。 javax.inject.Singleton 将解释被 EJB 忽略的行为。 javax.ejb.Singleton 是你想要的。

      【讨论】:

      • 是的,我使用的是 javax.ejb.Singleton
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2017-10-31
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多