EJB计时器服务:超时顺序

时间:2011-05-07 09:00:09

标签: timeout ejb

我有两个超时定义:
超时A - 每30秒
超时B - 每2分钟

// 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。

提前致谢, 彼得

2 个答案:

答案 0 :(得分:1)

没有内置的方式来订购这样的计时器。你可以手动完成:

  1. 使用info = 1
  2. 在30秒内为A安排单动作计时器
  3. 为B安排间隔计时器120秒
  4. 当A触发info = 1时,使用info = 2
  5. 在30秒内安排A的单动作计时器
  6. 当A触发info = 2时,使用info = 3
  7. 在30秒内为A安排单个动作计时器
  8. 当A触发info = 3时,请不要重新安排
  9. 当B点火时,拨打A,然后为B工作。在30秒内为A安排一个单动作计时器,信息= 1

答案 1 :(得分:0)

我使用的解决方案与bkail给出的解决方案非常相似。 有一个ejbTimeout()方法计划每30秒触发一次。使用包含计数器的Serializable对象安排超时:

createTimer(Date initialExpiration, long intervalDuration, Serializable info) 

每次调用ejbTimeout时,计数器都会增加。如果它达到3,则调用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;