关于以下假设计时器服务的安全性和正确性我几乎没有问题:
@Singleton
public class MyTimerService {
@Schedule(second = "*", minute = "*", hour = "*", persistent = false)
public void checkTakingOneMinute() {
// code below takes a minute or so
}
}
我想在这里做的就是尽快检查一下(在这种情况下每秒一次)。据我了解,方法checkTakingOneMinute()
在完成上一次调用之前不会开始新的检查。这就是我想要的,但是我担心容器的内部结构:方法执行是否会在忙碌时被跳过,或者它会被锁定并放入一个队列中以及随后的锁定超时?
答案 0 :(得分:4)
EJB规范要求容器调度“赶上”计时器事件,如果它因为已经运行而无法触发计时器。在实践中,容器可能在方法完成后重新计算下一个开火时间,然后如果下一个开火时间在当前时间“之前”则立即重新执行。我知道这就是WebSphere Application Server的工作方式。
请注意,bean的默认ConcurrencyManagement(ConcurrencyManagemementType.CONTAINER)
和timer方法的Lock(LockType.WRITE)
将阻止执行任何其他方法。如果您在该bean上需要其他方法,可以考虑使用ConcurrencyManagementType.BEAN
。
答案 1 :(得分:3)
我们在应用程序中使用Timers但在Weblogic中使用。据我所知,如果计时器线程在为下一个计划被唤醒时忙于处理某些事情,则唤醒进程将等待下一个计划重新执行,但这可以基于某些参数来控制。我在下面的Websphere中找到了一些关于它是如何完成的文档(我不确定这些可配置参数对于Websphere是什么) - 这个链接是否有助于澄清你的疑虑。在那里,他们提到了错过的计时器(重试和错过的超时部分),这是你所关注的。