事务TimeOut EJB对线程的影响

关于EJB的问题:

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

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

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

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

基于以上所述,可以推断,除非抛出TransactionRolledBackException否则永远不会破坏无限循环。 换句话说,只有在循环内尝试事务活动时才会中断循环; 如果没有执行这样的活动,那么循环将保留它的属性以无限期地执行。

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

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