【问题标题】:EJB automatic timers, locking, timeouts and long-running methodsEJB 自动计时器、锁定、超时和长时间运行的方法
【发布时间】:2012-03-16 15:09:00
【问题描述】:

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

@Singleton
public class MyTimerService {

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

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

【问题讨论】:

    标签: java jakarta-ee ejb ejb-3.0


    【解决方案1】:

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

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

    【讨论】:

    • 看来我的问题和stackoverflow.com/questions/2691835/…差不多,代码重写了,你的解决方案很好用,谢谢。
    • 你可能是对的。我倾向于编写个性化/定制的答案,而不是搜索副本(即使是我回答和忘记的答案!)。
    【解决方案2】:

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

    EJB timers in Websphere

    【讨论】:

    • 好文章,谢谢。您可能也对@bkail 解决方案感兴趣,请在他的回答下查看我的评论。
    猜你喜欢
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多