2011-05-07 108 views
0

我定義了兩個超時的設定的順序爲:
超時A - 每30秒
中止b - 每2分鐘
EJB計時器服務:

// scheduled for timeout A (every 30sec) 
@Stateless 
public class MyBeanA { 
    (...) 

    @Timeout 
    public void onTimeoutA(javax.ejb.Timer timer) { 
    // (...) 
    } 
} 

// scheduled for timeout B (every 2min) 
@Stateless 
public class MyBeanB { 
    (...) 

    @Timeout 
    public void onTimeoutB(javax.ejb.Timer timer) { 
    // (...) 
    } 
} 

人們很容易注意到,每2分鐘後,兩個超時將被解僱。我想確保在這種情況下,超時A會在超時之前被觸發B:
(30秒):timeoutA,(60sec):timeoutA,(90sec):timeoutA,(120sec):timeoutA,timeoutB

標準EJB(3.0)定時服務API可以嗎? 我的應用程序服務器是JBoss。

由於提前, 彼得

+0

也許你可以只允許一個控制這一切。即每30秒運行一次,每4個事件(120秒)讓它進行處理,然後在Bean B上調用相應的方法。 – planetjones 2011-05-07 22:59:42

回答

1

沒有內置的方式來訂購這樣的定時器。你可以手工進行:120秒

    1. 安排在一個單動計時器與信息30秒= 1
    2. 時間表乙間隔定時器當與信息= 1的火災,在信息= 2的情況下,在30秒內爲A安排單個動作計時器。
    3. 當信息= 3時觸發A ,不要重新安排
    4. 當B發生火災時,打電話給A,然後做窩rk for B.在信息= 1的30秒內安排A的單動定時器
  • 0

    我使用的解決方案與bkail給出的解決方案非常相似。 有一個ejbTimeout()方法計劃每30秒觸發一次。超時計劃爲包含計數器的可序列化對象:

    createTimer(Date initialExpiration, long intervalDuration, Serializable info) 
    

    每次調用ejbTimeout時,計數器都會增加。如果達到300,則方法應該在2分鐘後解僱被調用,並且還計數器重新設置爲0。它的工作原理如下:

     
    ejbTimeout after 30sec (counter == 0): call A(); counter++; 
    ejbTimeout after 30sec (counter == 1): call A(); counter++; 
    ejbTimeout after 30sec (counter == 2): call A(); counter++; 
    ejbTimeout after 30sec (counter == 3): call A(); call B(); counter = 0; 
    
    +0

    這在大多數情況下可能會起作用,但我會注意到定時器在EJB 3.0中是持久的,但計數器變量不會。 – 2011-05-19 17:15:50