如果我定义了一个EJB Timer(精确的EJB 3.0),它定期以间隔重复运行,并且单个调用时间比间隔长,那么容器
是在EJB规范或应用程序服务器中指定的吗?我对JBoss 5.1行为特别感兴趣。
致以最诚挚的问候,
Przemek
答案 0 :(得分:2)
简短的回答是我不认为这是指定的。
很长的答案是我确定这是在我查看EJB 3.2规范和javax.ejb API文档之前指定的,而且我找不到任何明确说明的内容。规范很清楚,如果单个超时失败,它必须至少重试一次(这将创建一个奇怪的情况,“旧”超时在“新”超时成功后重试)并且如果容器/应用程序关闭当一个计时器应该已经解雇时,它需要至少触发一次“赶上”,但我找不到任何谈论重叠超时方法的事情。
我不知道JBoss会做什么,但对于其他找到这个答案的人,我知道WebSphere Application Server以“串行”方式为单个Timer实现超时回调。也就是说,单个Timer只能激活一个未完成的超时,如果前一个超时仍在执行或重试,则不会发生后续的超时回调。延迟/重试超时完成后,服务器将立即触发“赶上”超时。可以更明确地说明此行为,但在讨论重试时,信息中心中的Creating timers using the EJB timer service for enterprise beans主题会提到此行为:
错过的执行是必须尝试的超时,但是 不,因为服务器不可用或忙于重试以前 失败超时。