我有一个带有以下计划方法的EJB:
@Schedule(hour = "*", minute = "*", second = "*/5", persistent = false)
public void runWorkerManager() {
final boolean jobProcessed = this.workerManager.execute();
if (jobProcessed) {
this.runWorkerManager();
}
}
这个想法是经常会有一个第二个(和第三个等)作业在处理完一个后处理,所以我想像上面那样再次运行execute()
方法。
问题是以这种方式执行它真的很糟糕,因为我没有释放EJB
线程。相反,我想为@Schedule
添加额外的触发器,以便尽快再次运行整个runWorkerManager()
。然而,我没有办法做到这一点
这可能吗?如果不是,是否有其他方法可以获得类似的行为?
答案 0 :(得分:0)
对我来说,这个用例需要MessageDrivenBean
。
在您的情况下,我会WorkerManager
MessageDrivenBean
收听正在发送JMS queue
的{{1}}个jobs
。通过这种方式,您可以确保在作业到达时尽快处理。
答案 1 :(得分:0)
我最终做的是首先获得TimerService
这样的引用:
@Resource
TimerService timerService;
然后我只是在我的方法中添加了@Timeout
注释,并使用TimerService#createTimer()
方法添加了一个新的触发器:
@Schedule(hour = "*", minute = "*", second = "*/5", persistent = false)
@Timeout
public void runWorkerManager() {
final boolean jobProcessed = this.workerManager.execute();
if (jobProcessed) {
timerService.createTimer(10L, "Check for more jobs...");
}
}