如果我定义了一个 EJB 计时器(准确地说是 EJB 3.0),它按间隔重复运行,并且单次调用时间比间隔长,容器是否会
- 与第一次调用同时运行超时方法
- 还是等到调用完成
- 或者是否会放弃第二次调用
- 还是会发生其他事情?
它是在 EJB 规范中指定的还是依赖于应用程序服务器的?我对 JBoss 5.1 的行为特别感兴趣。
最好的问候,
普热梅克
最佳答案
简短的回答是,我不认为这是指定的。
长答案是,在查看 EJB 3.2 规范和 javax.ejb API 文档之前,我确信这是指定的,但我找不到任何明确说明的内容。规范很明确,如果单个超时失败,它必须至少重试一次(这会产生一个奇怪的场景,即“旧”超时在"new"超时成功后重试)并且如果容器/应用程序关闭当计时器应该触发时它需要触发至少一个“ catch ”,但我找不到任何关于重叠超时方法的内容。
我不知道 JBoss 做了什么,但对于找到这个答案的其他人,我知道 WebSphere Application Server 以“串行”方式为单个 Timer 实现超时回调。即单个Timer只能有一个outstanding timeout处于 Activity 状态,如果前一个仍在执行或重试,则不会发生后续超时回调。在延迟/重试超时完成后,服务器将立即触发“ catch ”超时。这种行为可以更明确地说明,但是 Creating timers using the EJB timer service for enterprise beans信息中心的主题在讨论重试时暗示了这种行为:
A missed execution is a timeout that must have been attempted, but was not, because the server was unavailable or busy retrying a previously failed timeout.
关于java - 根据规范,EJB 计时器调用是否可以与指定计时器重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18740220/