混合JTA和JDBC事务

时间:2012-12-27 15:15:07

标签: java jpa jdbc jms jta

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

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

  1. 如果无法处理请求,则不会保留日志
  2. 如果无法更新日志(不太可能,但可能),则不会处理请求
  3. 所以另一个想法是使用常规JDBC事务创建和更新日志。只有请求事务的实体管理器才会加入用户事务,并且用于创建和更新日志的实体管理器将直接提交。

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

1 个答案:

答案 0 :(得分:2)

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

任务仍然相同:我启动一个(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();