为@Schedule添加额外的触发器

时间:2013-12-17 08:30:22

标签: java java-ee ejb

我有一个带有以下计划方法的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()。然而,我没有办法做到这一点 这可能吗?如果不是,是否有其他方法可以获得类似的行为?

2 个答案:

答案 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...");
    }
}