如果我定义了一个重复运行的EJB Timer(确切地说是EJB 3.0),并且单个调用时间长于时间间隔,容器会 同时运行超时方法和第一次调用 还是等待调用结束 或者第二次调用将被丢弃 还是会发生其他事情? 这是否在EJB规范或应用服务器中指定?我特别关注JBoss 5.1的行为。最好的问候,Przemek
简短的回答是我认为这并没有被规定。长的回答是,我之前确信这已经被规定了,但是在查看EJB 3.2规范和javax.ejb API文档后,我没有找到任何明确说明。规范清楚地指出,如果单个超时失败,则必须至少重试一次(这会创建一个“旧”的超时在“新”的超时成功后重新尝试的奇怪情况),并且如果容器/应用程序在计时器应该触发时关闭,则需要触发至少一个“补偿”,但我找不到任何关于重叠超时方法的内容。我不知道JBoss是做什么的,但对于其他人发现这个答案的人来说,我知道WebSphere应用服务器以“串行”方式为单个计时器实现超时回调。也就是说,对于单个计时器,只能有一个未完成的超时处于活动状态,如果先前的超时回调仍在执行或重试,则不会发生后续的超时回调。在延迟/重试的超时完成后,服务器将立即触发“赶上”超时。这种行为可以更明确地说明,但是InfoCenter中使用EJB计时器服务创建企业Bean的计时器主题在讨论重试时暗示了这种行为: