我有一个要求,这需要3-6计划任务在一天中的给定时间运行。我对EJB计时器完全陌生,但我读到过EJB计时器是在Java容器中处理计划任务的最佳方法。
设计问题:
假设我需要10个计划任务。如果可能的话,我不想创建10个EJB计时器。相反,我希望创建一个一次性的EJB计时器,然后重用它来创建所需的尽可能多的调度作业,传递每个实例的调度运行时间(作为aruguement),这是可能的吗?有没有人能帮我写一段关于这个的框架代码?
注意:我正在考虑使用非持久化EJB计时器...
发布于 2012-03-20 17:22:24
AFAIK在EJB信标中创建一个“可重用”的定时器是不可能的,因为你必须告诉每个定时器应该调用哪个方法。
看看这个:
第三方库Quartz Scheduler应该能够以编程方式创建Timer对象。也许值得一看!
希望这对你有所帮助,祝你玩得开心!
发布于 2012-03-20 18:50:12
另一种选择(除了alreay said之外)是对每个timed方法使用带有@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() {
//
}
}发布于 2012-03-20 18:37:50
您可以在一个无状态/消息驱动的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(...);
}
}这个示例与EJB3.0兼容。
https://stackoverflow.com/questions/9783837
复制相似问题