3

我有一个带有 JMS 和 JPA 的 Java SE(!) 场景,我可能需要分布式事务以及“常规”JDBC 事务。我必须监听一个发送服务请求的队列,在接收时保留日志,处理请求并在处理请求后更新日志。仅当请求已成功处理时,才应确认该消息。

第一个想法是只使用 JTA(由 Bitronix 提供)。但是我面临两个问题:

  1. 如果无法处理请求,则不会保留任何日志
  2. 如果无法更新日志,则不会处理请求(不太可能但可能)

所以另一个想法是使用常规的 JDBC 事务来创建和更新日志。只有请求事务的实体管理器会加入用户事务,而用于创建和更新日志的实体管理器会直接提交。

是否可以在单个持久性单元上“混合”JTA 和 JPA?或者我们是否已经有了这些 JMS 和 JDBC 事务的模式?

4

1 回答 1

2

我实际上用一种稍微不同的方法解决了我的问题。我没有“混合”JTA 和 JDBC 事务,而是使用了暂停恢复来处理不同的用户事务。

任务还是一样的:我启动一个(JTA)用户事务,其中包含一些 JMS 和 JDBC 事务(接收消息,执行一些数据库操作)。在那个工作流程的中间,我想写一个消息日志,但是当“外部”事务失败时,日志不会回滚。

所以解决方案是,在伪代码中:

 transactionManager.begin()
 doSomeJdbcStuff();
 Transaction main = transactionManager.suspend();

 // do the logging
 transactionManager.begin()  // <- now a new transaction is created and active!
 doSomeLogging();
 transactionManager.commit()

 // continue
 transactionManager.resume(main);
 doSomeMoreJdbcStuff();
 transactionManager.commit();
于 2013-01-08T14:17:38.277 回答