EJB自动计时器,锁定,超时和长时间运行的方法

时间:2012-03-16 15:09:00

标签: java java-ee ejb ejb-3.0

关于以下假设计时器服务的安全性和正确性我几乎没有问题:

@Singleton
public class MyTimerService {

  @Schedule(second = "*", minute = "*", hour = "*", persistent = false)
  public void checkTakingOneMinute() {
    // code below takes a minute or so
  }
}

我想在这里做的就是尽快检查一下(在这种情况下每秒一次)。据我了解,方法checkTakingOneMinute()在完成上一次调用之前不会开始新的检查。这就是我想要的,但是我担心容器的内部结构:方法执行是否会在忙碌时被跳过,或者它会被锁定并放入一个队列中以及随后的锁定超时?

2 个答案:

答案 0 :(得分:4)

EJB规范要求容器调度“赶上”计时器事件,如果它因为已经运行而无法触发计时器。在实践中,容器可能在方法完成后重新计算下一个开火时间,然后如果下一个开火时间在当前时间“之前”则立即重新执行。我知道这就是WebSphere Application Server的工作方式。

请注意,bean的默认ConcurrencyManagement(ConcurrencyManagemementType.CONTAINER)和timer方法的Lock(LockType.WRITE)将阻止执行任何其他方法。如果您在该bean上需要其他方法,可以考虑使用ConcurrencyManagementType.BEAN

答案 1 :(得分:3)

我们在应用程序中使用Timers但在Weblogic中使用。据我所知,如果计时器线程在为下一个计划被唤醒时忙于处理某些事情,则唤醒进程将等待下一个计划重新执行,但这可以基于某些参数来控制。我在下面的Websphere中找到了一些关于它是如何完成的文档(我不确定这些可配置参数对于Websphere是什么) - 这个链接是否有助于澄清你的疑虑。在那里,他们提到了错过的计时器(重试和错过的超时部分),这是你所关注的。

EJB timers in Websphere