2012-03-20 75 views
2

我有一个需求,需要3-6个计划任务才能在一天的给定时间运行。我对EJB定时器完全不熟悉,但已经读过EJB定时器是处理Java EE容器中计划任务的最佳方式。使用EJB定时器的Java EE调度程序任务

设计问题:

假设我需要10个计划任务。如果可能的话,我不希望创建10个EJB定时器。 相反,我想创建一个EJB定时器,然后重新使用它来创建所需的计划作业,并为每个实例传递计划的时间以运行(作为参考),这可能吗?有人可以请帮助这个骨架代码吗?

NB我想使用非持久性EJB计时器的...

回答

1

AFAIK是不可能在一个EJB创建一个“可重复使用的”计时器怎么一回事,因为你必须知道哪些方法被调用每个定时器。

看一看这样的:

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

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

+0

感谢您的答复家伙,SimonSez看了一眼Quatz,这看起来很有希望,然而,使用Quartz会导致j2EE容器中的非托管线程?我想在Websphere中使用它,是否有在WAS中使用Quartz并且不存在ummanaged线程问题的方法? – stack 2012-03-20 14:02:38

+0

我在开始时监视了我的环境(Glassfish 3.1.1)中的Quartz线程,并且找不到任何unnessacery/unmanaged线程,但是我偶然发现了一个导致此问题的旧bug报告(特别是与spring结合使用时)。从2.0.2开始可以修复。干杯! – SimonSez 2012-03-20 14:36:00

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兼容。

9

另一种选择(除了alreay说的)是使用单与@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() { 
    // 
    } 
}