Java TimerService EJB多次初始化
一方面,我有一个CronScheduler类,用于为每个应用程序启动一次,并配置TimerService。Java TimerService EJB多次初始化,java,multithreading,jakarta-ee,ejb,wildfly-8,Java,Multithreading,Jakarta Ee,Ejb,Wildfly 8,一方面,我有一个CronScheduler类,用于为每个应用程序启动一次,并配置TimerService。 另一方面,我有一项繁重的任务(注释为@EJB),我想在计时器的@timeout中调用它。请注意,在计时器中,我创建了一个调用p.go() 守则: @Singleton @Startup public class CronScheduler { @EJB Processor p; @Resource private TimerService timerService;
另一方面,我有一项繁重的任务(注释为
@EJB
),我想在计时器的@timeout
中调用它。请注意,在计时器中,我创建了一个调用p.go()
守则:
@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
注释工作正常吗?也许您运行了多个计时器?我最近遇到了一个奇怪的场景,计时器被设置为1k毫秒,新的计时器在前一个计时器完成之前启动。加上某种锁,我把它修好了。也许是类似的情况
您可以调试并检查有多少线程处于活动状态。我终于找到了;这是EJB和手工线程的问题。关键不在于计时器本身,而在于创建一个新线程,该线程不是由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);
timerService.createCalendarTimer(conf, new TimerConfig("desc msg ", false));
LOG.log(Level.INFO, ">> Ready for: " + conf.toString());
}
@Timeout
public void run() {
LOG.log(Level.INFO, "Calling the process");
p.go();
}
}
可能相关:以及