2014-10-18 52 views
1

JSR-000318 spec定義了TimerService(第18章)。如何爲同一個EJB @Timeout方法創建多個觸發器?

給定一個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明確指出,如果建立2個編程定時器使用相同ScheduleExpression同一個EJB時,容器必須調用@Timeout方法兩次一次

爲了讓我的問題更清楚。

讓我們假設我已經創建了2個編程定時器。每個人都有不同的元數據(存儲在可序列化的定時器INFO屬性中)。然後,我想要有兩個不同的計時器,並且@Timeout方法執行時,它將獲得此INFO屬性來選擇要執行的操作。

如果我的問題的答案是兩倍,比我能做到。如果我的問題的答案是一次,那麼我不能。

請注意,如果回答是一次,從性能的角度來看,從某種意義上講,實際上不需要多次通知EJB,即使您有多個觸發器對於它來說,但是如果你打算獨立處理這些觸發器(因爲每個觸發器都有一個不同的INFO),那麼當有人持續存在時,有人會忽略創建定時器的嘗試。

回答

1

定時器是不同的,所以如果你創建了兩個定時器,那麼無論調度信息是否相同,兩個定時器都會調用@Timeout方法。

+0

這就是我想過了,但是這不是TomEE +是如何實現的阿帕奇看到 – Leo 2014-10-21 09:32:51

+0

http://qnalist.com/questions/5209032/cluster-schedule – Leo 2014-10-21 09:36:13

+0

他們聲明「規範在持久化方面沒有說/強制任何東西」 – Leo 2014-10-21 09:37:39

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); 
    }