2012-03-16 68 views
2

我有一个关于安全和以下假设定时服务的正确性几个问题:EJB自动定时器,锁定,超时和长时间运行的方法

@Singleton 
public class MyTimerService { 

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

所有我想在这里做的,是尽快检查一番可能的(在这种情况下每秒)。据我了解,方法checkTakingOneMinute()将不会开始新的检查,直到它完成前面的调用。这就是我想要的,但是我担心容器的内部:方法执行会在忙时被忽略,或者它会被锁定并放入一个队列中,并随后出现锁定超时?

回答

3

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

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

+0

看起来像我的问题是几乎相同http://stackoverflow.com/questions/2691835/timer-service-in-ejb-3-1-schedule-calling-timeout-problem,代码重写,你的解决方案效果很好,谢谢。 – Osw 2012-03-17 11:02:52

+0

你可能是对的。我倾向于编写个性化/自定义的答案,而不是寻找双关(甚至是我回答并忘记的双关语!)。 – 2012-03-18 23:42:48

1

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

EJB timers in Websphere

+0

好文章,谢谢。您可能也对@bkail解决方案感兴趣,请参阅他的回答下的评论。 – Osw 2012-03-17 11:05:36