繁体   English   中英

JMS 和 JPA 没有两阶段提交的事务(即不支持 JTA)

[英]JMS and JPA transactions without two phase commit (i.e. JTA is not supported)

我正在迁移在 JEE 应用程序服务器上运行的 Spring 启动应用程序,它使用 JTA 来协调 JMS 和 JPA 事务:

  • 处理消息时引发的异常触发 JPA 和 JMS 回滚(即消息返回到原始队列)
  • 如果所有数据库操作都成功,并且,消息被成功移动到下一个队列,JPA 和 JMS 事务都被提交

目标环境不支持 JTA

我正在寻找有关如何设置事务管理器的指导,以便:

  • JPA 事务在启动 JMS 事务后立即启动
  • JPA 事务在终止 JMS 事务之前结束
  • 终止 JPA 事务失败将使 JMS 事务失败

任何文档或示例代码都会很棒。

提前谢谢了

对于没有资源支持 XA 或 JTA 的这种情况,一种可能的前进方式是:

  • JMS提供者
  • 数据库驱动程序

...是使用配置为运行两个事务的“括号”事务管理器。 在高层次上,步骤如Dave Syer 的文章中所指定

  1. 开始消息交易
  2. 接收消息
  3. 启动数据库事务
  4. 更新数据库
  5. 提交数据库事务
  6. 提交消息事务

Spring 数据项目提供了这样一个事务管理器:参见ChainedTransactionManager

当错误发生在提交数据库事务时(即第 5 步),此策略很有效。对于错误发生在 JMS 提交(即第 6 步)的情况,将以死信形式的消息结束。

使用 100,000 条消息测试此实现表明大约 0.005% 的消息以死信结束。 有些是在提交 JPA 事务时发生错误,有些是 JMS。

为了使系统可操作,无论故障点如何,死信中的消息都应该是可重试的。 这意味着括号事务管理器选项仅在应用程序更改为实现幂等性时才可行:跟踪已处理的 JMS 消息 ID。 当 JMS 消息 ID 已被处理时,应用程序必须跳过更新部分,即第 4 步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM