multithreading - 具有容器管理事务和工作线程的 MDB

标签 multithreading jakarta-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()”?预防问题的正确方法是吗?

最佳答案

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

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

来自 EJB 3.0 规范:

The enterprise bean must not attempt to manage threads. The enterprise bean must not attempt to start, stop, suspend, or resume a thread, or to change a thread’s priority or name. The enterprise bean must not attempt to manage thread groups.

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

关于multithreading - 具有容器管理事务和工作线程的 MDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13402585/

相关文章:

windows-phone-7 - WP7 无效的跨线程访问 - ScheduledTaskAgent

multithreading - 使用多线程时Kotlin无法解析的引用

sql-server - WAS 8.5 在故障转移处理具有 JNDI 名称 XXX 的资源时无法找到主池管理器

我当前的安装中不存在 Websphere manageprofile 文件

java - 为什么不能在 Thread 实例中使用 notifyAll()?

java - 在 Eclipse 中使用 J2EE Preview 运行时在 Java EE 中实现 RESTful 服务

java - 根据某些 System.getProperty() 更改 web.xml

java - 密码检查成功后加载新网页

java - ServletException 打开我的应用程序时

c++ - 与 linux 信号/条件变量相比的缓存一致性开销