如何为同一EJB @Timeout方法创建多个触发器?

时间:2014-10-18 14:24:39

标签: java timer ejb-3.1

JSR-000318规范定义了TimerService(第18章)。

鉴于EJB,您可以创建自动计时器程序化计时器

自动计时器看起来像这样

@Schedules(
{
  @Schedule(hour=”12”, dayOfWeek=”Mon-Thu”),
  @Schedule(hour=”11”, dayOfWeek=”Fri”)
})
public void sendLunchNotification() { ... }

程序化计时器看起来像这样

@Resource
private TimerService timerService;

void someMethod(){
   ScheduleExpression exp = new ScheduleExpression();
   (... set exp ...)
   TimerConfig config = new TimerConfig();
   (... set config ...)
   Timer created = timerService.createCalendarTimer(exp,config);
}

创建程序化计时器时,计时器触发的任务是使用@Timeout

注释的任务

我的问题,因为我在JSR中找不到它,如果使用相同的ScheduleExpression为同一个EJB创建2个编程计时器,容器必须调用@Timeout方法两次一次

让我的问题更清楚。

假设我已经创建了2个程序化计时器。每个元数据都有不同的元数据(存储在可序列化计时器INFO属性中)。然后,我想要有两个不同的计时器,当@Timeout方法执行时,它会获得这个INFO属性来选择做什么。

如果我的问题的答案是两次,那么我可以做到。如果我的问题的答案是一次,那么我就不能。

请注意,如果答案是一次,从性能的角度来看,这是有道理的,因为您实际上并不需要在给定时刻多次通知EJB,即使你有几个触发器,但如果你打算独立处理这些触发器(因为每个触发器有不同的INFO),那么有人只是忽略了创建计时器的尝试,因为已经存在一个计时器

2 个答案:

答案 0 :(得分:2)

做这样的事情:

@Singleton
@Startup
public class TestBean {

    // should be in a separate class
    public enum TTimer {
        FOO,
        BAR
    }

    @Resource
    TimerService timerService;

    @PostConstruct
    private void initSingleTimer() {
        removeRunningTimers();
        startInitialTimer();
    }

    private void removeRunningTimers() {
        for (Timer t : timerService.getTimers()) {
            if ( t.getInfo().equals(TTimer.FOO)) {
                t.cancel();
                log.trace("LogWatcher: Running timer canceled");                    
            }
        }
    }

    private void startInitialTimer() {
        ....
        timerService.createTimer(startDate, interval, TTimer.FOO);
    }

答案 1 :(得分:1)

定时器是不同的,所以如果你创建两个,那么无论调度信息是否相同,都会为两个定时器调用@Timeout方法。

相关问题