2015-06-17 62 views
1

我创建了一个包含EJB的测试应用程序,该应用程序应该每秒打印一次当前的Timestamp。现在,在我的wild dep上部署Web应用程序后,我每秒钟都会收到5条日志消息...看起来像运行多个调度程序,这将触发输出...Wildfly Scheduled EJB-多次执行

您有任何想法,要解决这个问题?如果我只用注释的@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); 
    } 
} 

...和here's您参见输出每秒打印多份:

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 

回答

0

您不显示您的软件包导入。 javax.inject.Singleton会解释被EJB忽略的行为。 javax.ejb.Singleton是你想要的。

+0

是的,我用的是使用javax。 ejb.Singleton – goblingift

1

我已经知道了 - 我用java任务控件查找野蛮人上运行的定时器,并且有多个Timer。

所以从来就编辑我的代码,杀应用程序的所有现有的定时器,然后创建一个定时器,以确保,其实只有一个计时:

@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); 

}