如果我定义了一个 EJB 计时器(准确地说是 EJB 3.0),它以间隔重复运行并且单个调用时间长于间隔,那么容器会
- 在第一次调用时同时运行超时方法
- 还是会等到调用完成
- 还是会放弃第二次调用
- 还是会发生其他事情?
它是在 EJB 规范中指定还是依赖于应用程序服务器?我对 JBoss 5.1 的行为特别感兴趣。
此致,
普热梅克
如果我定义了一个 EJB 计时器(准确地说是 EJB 3.0),它以间隔重复运行并且单个调用时间长于间隔,那么容器会
它是在 EJB 规范中指定还是依赖于应用程序服务器?我对 JBoss 5.1 的行为特别感兴趣。
此致,
普热梅克
简短的回答是我不认为这是指定的。
长答案是,在我查看 EJB 3.2 规范和 javax.ejb API 文档之前,我确信这是指定的,但我找不到任何明确的说法。规范很清楚,如果单个超时失败,它必须至少重试一次(这会产生一个奇怪的场景,即“旧”超时在“新”超时成功后重试)并且如果容器/应用程序已关闭当一个计时器应该触发时,它需要触发至少一个“追赶”,但我找不到任何关于重叠超时方法的内容。
我不知道 JBoss 做了什么,但对于其他找到这个答案的人,我知道 WebSphere Application Server 以“串行”方式为单个 Timer 实现超时回调。也就是说,单个 Timer 只能激活一个未完成的超时,如果前一个仍在执行或重试,则不会发生后续的超时回调。延迟/重试超时完成后,服务器将立即触发“赶上”超时。这种行为可以更明确地说明,但是信息中心中的为企业 bean 创建使用 EJB 定时器服务的定时器主题在讨论重试时暗示了这种行为:
错过执行是必须尝试的超时,但没有尝试,因为服务器不可用或忙于重试先前失败的超时。