3

关于 EJB 的一个问题:

假设我有一个具有无限循环的会话 bean。它在 EJB 事务下运行。现在当 EJB 的事务超时时,是否会导致无限循环线程中断或容器将停止运行无限循环的线程。

4

2 回答 2

8

现在当 EJB 的事务超时时,是否会导致无限循环线程中断或容器将停止运行无限循环的线程。

这个答案基于我几年前在 OC4J 10.3.x、WebSphere 6.x 和 WebLogic 10.x 上执行的逆向工程,并且可能以类似的方式应用于其他容器。据我所知,事务超时检测在不同容器中的实现方式不同,但它们都采用了一些共同的原则,如下所述:

  • 事务超时检测通常在容器管理的不同线程中执行。相关线程休眠指定的持续时间(通常为 1 秒),然后唤醒并遍历所有正在进行的事务。如果任何事务超过了指定的超时时间(通常在各个级别 - JTA 容器、EJB 等),那么线程将标记事务以进行回滚。不会尝试向执行事务的线程发出有关事务状态的信号。
  • 当执行事务的线程尝试与 JTA 协调器或事务资源(XAResource实例)交互以完成某些工作(例如,发出 SQL 查询)时,容器将确定该事务已被标记为回滚,并会抛出一个TransactionRolledBackException.

综合以上可以推断,除非TransactionRolledBackException抛出a,否则无限循环永远不会被打破。换句话说,只有在循环内尝试事务活动时,循环才会被打破;如果没有执行此类活动,则循环将保留其无限期执行的属性。

请注意,某些容器(如 WebLogic)允许检测“卡住”线程。这意味着此类容器能够检测线程是否已经执行了超过配置持续时间的延长时间。这并不意味着容器会在检测到线程被卡住时终止或中断线程。

于 2011-07-11T08:26:53.357 回答
1

不,容器通常不可能自动检测到无限循环。某些应用程序服务器可能会检测到事务已超时或 EJB 已长时间处于活动状态。

于 2011-07-08T13:47:19.103 回答