MDB与容器管理的交易&工人线程

时间:2012-11-15 17:05:43

标签: multithreading java-ee websphere jta message-driven-bean

我有一个使用容器管理事务的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()”?是否有正确的方法来预防问题?

2 个答案:

答案 0 :(得分:2)

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

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

来自EJB 3.0规范:

  

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

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

答案 1 :(得分:1)

如果您使用的是ejb 3.1,那么选项将是使用

注释的方法进行工作。
@Asynchronous

这将为您提供一个新的交易,工作将在一个单独的线程中执行。

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

详细了解默认交易模式:Default EJB transaction mode for asynchronous methods?