【问题标题】:Java EE Scheduler Task using EJB Timers使用 EJB 计时器的 Java EE 调度程序任务
【发布时间】:2012-03-20 09:00:37
【问题描述】:

我有一个要求,需要在一天中的给定时间运行 3-6 个计划任务。我对 EJB 计时器完全陌生,但我了解到 EJB 计时器是在 Java EE 容器中处理计划任务的最佳方式。

设计问题:

假设我需要 10 个计划任务。如果可能的话,我不想创建 10 个 EJB 计时器。 相反,我想创建一个一次性的 EJB 计时器,然后重用它来创建尽可能多的预定作业,为每个实例传递预定的运行时间(作为参数),这可能吗?有人可以帮忙提供一个骨架代码吗?

注意,我正在考虑使用非持久性 EJB 计时器 ...

【问题讨论】:

    标签: java jakarta-ee


    【解决方案1】:

    另一种选择(除了已经说过)是对每个定时方法使用带有 @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() {
        //
      }
    }
    

    【讨论】:

      【解决方案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 兼容。

      【讨论】:

        【解决方案3】:

        AFAIK 不可能在 EJB 中创建一个“可重用”计时器,因为您必须告诉每个计时器应该调用哪个方法。

        看看这个:

        第 3 方库 Quartz Scheduler 应该能够以编程方式创建计时器对象。也许值得一看!

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

        【讨论】:

        • 感谢大家的回复,SimonSez 看过 Quatz,它看起来很有希望,但是,使用 Quartz 会导致 J2EE 容器中的非托管线程吗?我想在 Websphere 中使用它,有没有办法在 WAS 中使用 Quartz 而不会遇到非托管线程的问题?
        • 我一开始就在我的环境(Glassfish 3.1.1)中监控了 Quartz 线程,但找不到任何不合理/非托管的线程,但我偶然发现了一个导致此问题的旧错误报告(尤其是结合弹簧)。自 2.0.2 以来似乎已修复。干杯!
        猜你喜欢
        • 2016-07-11
        • 2017-12-28
        • 1970-01-01
        • 2012-11-14
        • 2014-07-08
        • 2014-08-03
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多