Java 事务超时对线程的影响

Java 事务超时对线程的影响,java,transactions,ejb,stateless-session-bean,Java,Transactions,Ejb,Stateless Session Bean,关于EJB的一个问题: 假设我有一个会话bean,它有一个无限循环。它在EJB事务下运行。现在,当EJB事务超时时,会导致无限循环线程中断,还是容器会停止运行无限循环的线程。否,容器通常不可能自动检测无限循环。一些应用程序服务器可能检测到事务已超时或EJB已处于活动状态很长时间 现在,当EJB事务超时时,这会导致无限循环线程中断,还是容器会停止运行infinte循环的线程 这个答案基于我几年前在OC4J 10.3.x、WebSphere 6.x和WebLogic 10.x上执行的反向工程,并且可

关于EJB的一个问题:


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

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

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

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

  • 事务超时检测通常在容器管理的不同线程中执行。相关线程在指定的持续时间内休眠(通常为1秒),然后唤醒并遍历所有正在进行的事务。如果任何事务超过了指定的超时时间(通常在不同的级别-JTA容器、EJB等),那么线程将标记该事务以进行回滚。不会尝试向执行事务的线程发出有关事务状态的信号
  • 当执行事务的线程尝试与JTA协调器或事务资源(一个
    XAResource
    实例)交互以执行某些工作(例如,发出SQL查询)时,容器将确定事务已标记为回滚,并将抛出一个
    TransactionRolledBackException
基于以上,可以推断,除非抛出
TransactionRolledBackException
,否则无限循环将永远不会中断。换句话说,只有在循环中尝试事务性活动时,循环才会被打破;如果没有执行此类活动,则循环将保留其属性以无限期执行

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