关于 EJB 的一个问题:
假设我有一个具有无限循环的会话 bean。它在 EJB 事务下运行。现在当 EJB 的事务超时时,是否会导致无限循环线程中断或容器将停止运行无限循环的线程。
关于 EJB 的一个问题:
假设我有一个具有无限循环的会话 bean。它在 EJB 事务下运行。现在当 EJB 的事务超时时,是否会导致无限循环线程中断或容器将停止运行无限循环的线程。
现在当 EJB 的事务超时时,是否会导致无限循环线程中断或容器将停止运行无限循环的线程。
这个答案基于我几年前在 OC4J 10.3.x、WebSphere 6.x 和 WebLogic 10.x 上执行的逆向工程,并且可能以类似的方式应用于其他容器。据我所知,事务超时检测在不同容器中的实现方式不同,但它们都采用了一些共同的原则,如下所述:
XAResource
实例)交互以完成某些工作(例如,发出 SQL 查询)时,容器将确定该事务已被标记为回滚,并会抛出一个TransactionRolledBackException
.综合以上可以推断,除非TransactionRolledBackException
抛出a,否则无限循环永远不会被打破。换句话说,只有在循环内尝试事务活动时,循环才会被打破;如果没有执行此类活动,则循环将保留其无限期执行的属性。
请注意,某些容器(如 WebLogic)允许检测“卡住”线程。这意味着此类容器能够检测线程是否已经执行了超过配置持续时间的延长时间。这并不意味着容器会在检测到线程被卡住时终止或中断线程。
不,容器通常不可能自动检测到无限循环。某些应用程序服务器可能会检测到事务已超时或 EJB 已长时间处于活动状态。