我有一项要求,要求在当天的给定时间运行3-6个计划任务。我是EJB计时器的新手,但已经读过EJB计时器是处理Java EE容器中计划任务的最佳方法。
设计问题:
假设我需要10个预定任务。如果可能的话,我不希望创建10个EJB计时器。 相反,我希望创建一个关闭的EJB计时器,然后重新使用它来创建所需的预定作业,为每个实例传递预定的运行时间(作为aruguements),这可能吗?有人可以帮忙解决这个问题吗?
N.B我正在考虑使用非持久性EJB计时器......
答案 0 :(得分:9)
另一个选项(除了已经说过)是为每个定时方法使用带@Schedule
注释的单例:
@Singleton
@Startup
public class TimedTaskManager {
@Schedule(second = "0", minute = "*/5", hour = "*")
public void runTask1() {
//
}
@Schedule(second = "15", minute = "*/5", hour = "6,7,8")
public void runTask2() {
//
}
//
//
@Schedule(second = "0", minute = "*", hour = "1,2,6")
public void runTaskN() {
//
}
}
答案 1 :(得分:2)
你可以在你的一个无状态/消息驱动的bean业务方法中定义一个定时器(你仍然需要调用它,但是,不可能创建一个可以自己启动的定时器)。然后,在@Timeout
方法中,您可以根据您认为合适的任何逻辑重新创建计时器,即
@Stateless
public SomeEJB ... {
@Resource
private TimerService timerService;
public void businessMethod() {
timerService.createTimer(...);
}
@Timeout
public void timeout(Timer timer) {
// do some timer-related logic, recreate the timer,
// perhaps with new duration
timerService.createTimer(...);
}
}
此示例与EJB 3.0兼容。
答案 2 :(得分:1)
AFAIK无法在EJB中创建一个“可重用”计时器,因为您必须告诉每个计时器应该调用哪个方法。
看看这个:
第三方库Quartz Scheduler应该能够以编程方式创建Timer对象。也许值得一看这个!
希望这有帮助,玩得开心!