首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EJB计时器的Java EE调度器任务

使用EJB计时器的Java EE调度器任务
EN

Stack Overflow用户
提问于 2012-03-20 17:00:38
回答 3查看 14.2K关注 0票数 2

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

设计问题:

假设我需要10个计划任务。如果可能的话,我不想创建10个EJB计时器。相反,我希望创建一个一次性的EJB计时器,然后重用它来创建所需的尽可能多的调度作业,传递每个实例的调度运行时间(作为aruguement),这是可能的吗?有没有人能帮我写一段关于这个的框架代码?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-20 17:22:24

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

看看这个:

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

希望这对你有所帮助,祝你玩得开心!

票数 1
EN

Stack Overflow用户

发布于 2012-03-20 18:50:12

另一种选择(除了alreay said之外)是对每个timed方法使用带有@Schedule注释的单例:

代码语言:javascript
复制
@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() {
    //
  }
}
票数 9
EN

Stack Overflow用户

发布于 2012-03-20 18:37:50

您可以在一个无状态/消息驱动的bean业务方法中定义一个计时器(但是,您仍然必须调用它,因为不可能创建一个自动启动的计时器)。然后,在@Timeout方法中,您可以根据发现合适的任何逻辑重新创建计时器。

代码语言:javascript
复制
@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兼容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9783837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档