【问题标题】:EJB Timer Service: order of timeoutsEJB 定时器服务:超时顺序
【发布时间】:2011-05-07 09:00:09
【问题描述】:

我定义了两个超时:
超时 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 之前触发:
(30sec): timeoutA, (60sec): timeoutA, (90sec): timeoutA, (120sec): timeoutA, timeoutB

是否可以使用标准 EJB (3.0) Timer Service API? 我的应用服务器是 JBoss。

提前致谢, 彼得

【问题讨论】:

  • 也许你可以让 A 控制这一切。 IE。每 30 秒运行一次 A,每 4 个事件(120 秒)让它进行处理,然后在 Bean B 上调用适当的方法。

标签: timeout ejb


【解决方案1】:

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

  1. 在 info=1 的情况下在 30 秒内为 A 安排一个单动作计时器
  2. 为 B 安排一个 120 秒的间隔计时器
  3. 当 A 在 info=1 的情况下触发时,在 info=2 的情况下在 30 秒内为 A 安排一个单动作计时器
  4. 当 A 在 info=2 的情况下触发时,在 info=3 的情况下在 30 秒内为 A 安排一个动作计时器
  5. 当 A 以 info=3 触发时,不要重新安排
  6. 当 B 触发时,呼叫 A,然后为 B 执行工作。在 info=1 的情况下在 30 秒内为 A 安排一个单动作计时器

【讨论】:

    【解决方案2】:

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

    createTimer(Date initialExpiration, long intervalDuration, Serializable info) 
    

    每次调用 ejbTimeout 时,计数器都会增加。如果达到 3,则调用应该在 2 分钟后触发的方法,并将计数器设置回 0。它的工作原理如下:

    ejbTimeout after 30sec (counter == 0): call A();计数器++; ejbTimeout after 30sec (counter == 1): call A();计数器++; ejbTimeout after 30sec (counter == 2): call A();计数器++; ejbTimeout after 30sec (counter == 3): call A();调用 B();计数器 = 0;

    【讨论】:

    • 这可能在大多数情况下都有效,但我会注意到 Timers 在 EJB 3.0 中是持久的,但计数器变量不会。
    猜你喜欢
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2014-05-08
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多