Java Wildfly调度EJB-执行多次

Java Wildfly调度EJB-执行多次,java,ejb,wildfly,Java,Ejb,Wildfly,我创建了一个测试应用程序,它包含一个EJB,应该每秒打印一次当前的时间戳。现在,在我的wildfly上部署web应用程序后,我每秒会收到大约5条日志消息…看起来有多个调度程序正在运行,这会触发输出 你有什么想法,如何解决它?如果我只是用@Schedule注释methode,它会每秒打印结果,但通过编程设置计时器会产生问题: @Singleton @Startup public class Scheduler { @Resource TimerService timerServi

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

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

@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

您不显示您的包导入
javax.inject.Singleton
将解释EJB忽略的行为<代码>javax.ejb.Singleton是您想要的。我已经找到了它-我在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);

}

是的,我使用的是javax.ejb.Singleton