我有一个MDB
来根据某些条件触发进程(线程)。 进程/线程
是一个长时间运行的进程,因此我们不想保留触发MDB
的线程。
因此,我们创建一个新线程并将其自由地提交给托管任务执行器,并且偶尔会在事情尚未准备好时进入休眠状态。
线程从数据库读取记录,将其作为消息发布到另一个MQ/JMS 队列
,然后将记录写入数据库。
我希望MQ/JMS消息
和数据库写入成为事务
的一部分 - 两者应该一起成功/失败。
如何在 IBM liberty 环境
中执行此操作。
如有任何建议/帮助,我们将不胜感激。谢谢!!
我尝试使用 @Transactional
和 REQUIRES_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/