java - ibm liberty 中的 JTA 事务配置

标签 java multithreading transactions websphere-liberty jta

我有一个MDB来根据某些条件触发进程(线程)。 进程/线程是一个长时间运行的进程,因此我们不想保留触发MDB的线程。

因此,我们创建一个新线程并将其自由地提交给托管任务执行器,并且偶尔会在事情尚未准备好时进入休眠状态。

线程从数据库读取记录,将其作为消息发布到另一个MQ/JMS 队列,然后将记录写入数据库。

我希望MQ/JMS消息和数据库写入成为事务的一部分 - 两者应该一起成功/失败。

如何在 IBM liberty 环境中执行此操作。

如有任何建议/帮助,我们将不胜感激。谢谢!!

我尝试使用 @TransactionalREQUIRES_NEW 进行注释,但不起作用。

通常我们可能必须定义使用 JTA 事务,然后使用 @Transactional 进行注释。

最佳答案

根据规范,ManagedExecutorService 任务不在事务下运行。然而,他们确实有能力开始新的交易。您可以按如下方式进行操作,

executor.submit(() -> {
    UserTransaction tx = InitialContext.doLookup("java:comp/UserTransaction");
    tx.begin();
    try {
        try (Connection con = dataSource.getConnection()) {
            ResultSet results = con.createStatement().executeQuery(...);
            ... process result set and send messages
            ... update database
        }
    } finally {
        tx.commit(); // or tx.rollback
    }
    return null;
});

关于java - ibm liberty 中的 JTA 事务配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54242976/

相关文章:

java - 使用Arquillian进行测试,如何共享Arquillian.xml?

java - 如何在java中服务器端获取<select>的值

PHP/mysqli : unintended rollback in query across two mysql databases

java - 使用 JPA 的事务边界和 DTO 转换

java - Android简单绘制

postgresql - sequelize 更新事务锁行

java - 在 Android 4 上设置 FrameLayout 背景时出错

java - 从内部存储中删除多个选中的文件

android - 该应用程序显示即使在后台线程中执行了操作,也在主线程中做了过多的工作

java - 使用共享内存时提高程序加速