В одной руке у меня есть класс 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();
}
}
Дело в том, хрон является инициализировать несколько раз. Код @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