EJB TimerService行为

时间:2013-07-15 17:26:21

标签: java-ee ejb websphere-8

我有一个使用TimerService的应用程序,我正在创建一些运行特定任务的计时器。它工作正常。但是,我注意到超时有些延迟。我有一个超时“A”计划每10分钟运行一次,另一个“B”每隔3分钟运行一次。如果“A”需要5分钟才能运行,“B”只会在“A”结束后运行,导致延迟2分钟。这是一个问题,因为事情没有准备就绪。我的问题是,如果有一种方法可以同时运行TimerService。我正在使用的代码片段如下。我感谢任何帮助。

计划创建:

// Every schedule extend from this class.
public abstract class Schedule {
@Resource
private TimerService timerService;

public void start() {
        TimerConfig timerConfig = new TimerConfig();
        timerConfig.setInfo(name);
        timerConfig.setPersistent(false);
        timerService
                .createCalendarTimer(this.calendarSchedule, timerConfig);
}

}

计划实施:

@Named
@Stateless 
public class MyScheduleEJB extends Schedule {
   @Timeout
   public void timeout(Timer timer) {
    // do the work
   }
 }

2 个答案:

答案 0 :(得分:3)

这是Application Server中非常具体的情况。但是,如果其他人遇到同样的问题,那么Websphere中的配置(不确定其他AS)会告诉计时器池应该使用多少个线程。默认值只有1,这就是它没有同时运行的原因。配置:WAS Config

答案 1 :(得分:1)

我在这里看到两个问题:

首先,您为什么使用createCalendarTimer方法?我认为最适合您需求的TimerService方法(每5秒或10秒执行一次)是createIntervalTimer。

其次,我认为实现EJB Timer的方式不符合EJB规范。

他说:

  

18.2Bean Provider的定时器服务视图

     

使用计时器服务的企业bean的bean类必须   提供一个或多个超时回调方法。

     

18.3Bean提供者的责任

     

要向Timer Service注册的企业bean   必须有一个超时回调方法。企业bean类可能有   超类和/或超接口。如果bean类有   超类,超时方法可以在bean类中定义,或者   在任何超类中。

如您所见,有关如何实现EJB Timer的一些限制。可能规范有几种解释,但在阅读完之后我会毫不犹豫地改变我的代码。