3

我有一个使用 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
   }
 }
4

2 回答 2

3

这是应用服务器中非常特殊的情况。但是如果其他人有同样的问题,Websphere 中有一个配置(不确定其他 AS)告诉计时器池应该使用多少线程。默认只有 1,这就是它没有同时运行的原因。配置:WAS 配置

于 2013-07-16T19:44:45.013 回答
1

我在这里看到两个问题:

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

其次,我认为您实现 EJB Timer 的方式不遵循 EJB 规范。

他说:

18.2Bean Provider对Timer Service的看法

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

18.3 Bean Provider 的责任

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

如您所见,关于如何实现 EJB 计时器有一些限制。可能该规范有多种解释,但在阅读此内容后,我会毫不犹豫地更改我的代码。

于 2013-07-15T23:56:37.763 回答