2011-05-07 93 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