一方面,我有一個CronScheduler類,它意味着每個應用程序啓動一次配置TimerService。
另一方面,我有一個沉重的任務(註釋爲@EJB
),我想在定時器的@timeout
中打電話。請注意,在計時器,我創造它調用p.go()
TimerService EJB初始化多次
代碼線程:
@Singleton
@Startup
public class CronScheduler {
@EJB
Processor p;
@Resource
private TimerService timerService;
@PostConstruct
public void init() {
String h = ... // h,m ,s work fine
String m = ...
String s = ...
ScheduleExpression conf = new ScheduleExpression();
conf.hour(h);
conf.minute(m);
conf.second(s);
// I've tried with the second param (TimerConfig) enabled and disabled
timerService.createCalendarTimer(conf, new TimerConfig("msg ", false));
LOG.log(Level.INFO, ">> Ready for: " + conf.toString());
}
@Timeout
public void run() {
LOG.log(Level.INFO, "Calling the process");
Thread t = new Thread() {
@Override
public void run() {
super.run();
p.go();
}
};
t.start();
}
}
的一點是,在cron是初始化多次。 @PostConstruct
代碼運行N次。在我看到的日誌中。
Ready for: A-B-C
Ready for: A-B-C
Ready for: A-B-C
後果是p.go()
被稱爲多次。 @singleton
註釋工作正常嗎?
可能相關:http://stackoverflow.com/questions/9077966/postconstruct-method-called-twice-for-the-same-request和http://stackoverflow.com/questions/16796320/cdi -bean構造函數和-postconstruct所謂的海報倍 – assylias