2

我有一个使用容器管理事务的 MDB(我的容器是 IBM Websphere 7)。

Websphere 正在使用全局 (JTA) 事务。

如果我的 MDB 线程启动了一个工作线程,并且该线程开始了一个事务,那么该新线程是否会与 MDB 在同一个事务中?

我希望 MDB 线程在我的工作线程成功启动后立即提交其事务并确认 MQ 消息。如果工作线程回滚,我不希望我的 MDB 回滚。

编辑:线程中的代码有这个 - 它没有使用注释:

    txn = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
    txn.begin();

因此,如果查看 txn.getStatus(),它将不是 STATUS_NO_TRANSACTION。因此,我需要获取适用于 Websphere 7 的事务管理器并在 txn.begin() 之前调用“suspend()”?预防问题的正确方法是什么?

4

2 回答 2

2

将不应与方法在同一事务中的代码onMessage()放入单独的方法中,并将该方法的事务属性设置为REQUIRES_NEW. 这将在调用该方法时创建一个新事务,并且此新事务的成功或失败不会影响先前存在的事务。

顺便说一句,您不应该在 JavaEE 应用程序中进行显式线程管理。

从 EJB 3.0 规范:

企业 bean 不得尝试管理线程。企业 bean 不得尝试启动、停止、挂起或恢复线程,或者更改线程的优先级或名称。企业 bean 不得尝试管理线程组。

您可以考虑使用计时器服务来有效地创建单独的线程,同时将线程管理留给服务器。

于 2012-11-15T19:54:13.903 回答
1

如果您使用的是 ejb 3.1,则可以选择以使用注释的方法进行工作人员工作

@Asynchronous

这将为您提供一个新事务,并且该工作将在一个单独的线程中执行。

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/asyncMethodOfEJB/AsyncMethodEJB.html

阅读有关默认事务模式的更多信息:异步方法的默认 EJB 事务模式?

于 2012-11-15T20:30:58.267 回答