使用EJB计时器的Java EE计划程序任务

时间:2012-03-20 09:00:38

标签: java java-ee

我有一项要求,要求在当天的给定时间运行3-6个计划任务。我是EJB计时器的新手,但已经读过EJB计时器是处理Java EE容器中计划任务的最佳方法。

设计问题:

假设我需要10个预定任务。如果可能的话,我不希望创建10个EJB计时器。 相反,我希望创建一个关闭的EJB计时器,然后重新使用它来创建所需的预定作业,为每个实例传递预定的运行时间(作为aruguements),这可能吗?有人可以帮忙解决这个问题吗?

N.B我正在考虑使用非持久性EJB计时器......

3 个答案:

答案 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对象。也许值得一看这个!

希望这有帮助,玩得开心!