首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JDBC提交成功后处理JMS提交失败

在JDBC提交成功后处理JMS提交失败
EN

Stack Overflow用户
提问于 2020-11-25 05:42:30
回答 1查看 155关注 0票数 1

在我的应用程序中,我从JMS读取并写入数据库。为了处理这种情况,ActiveMQ文档有以下几个方面:

代码语言:javascript
复制
onMessage
try {
   if I have not processed this message successfully before {
   do some stuff in the database / with EJBs etc
   jdbc.commit() (unless auto-commit is enabled on the JDBC)
}
jms.commit()
} catch (Exception e) {
   jms.rollback()
}

我的问题是,假设我们在执行jms.commit()时面临问题,然后回滚jms会话。但是我们的db提交已经完成了。由于我们回滚了jms会话,队列将再次将该数据发送给使用者,这将导致数据库中的重复数据。我们在ActiveMQ Artemis队列上的故障转移场景中经历了这种情况。是否有其他方法可以避免在db或数据丢失上造成重复?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-25 15:53:19

通常,这种情况将使用XA事务(使用两阶段提交协议)来处理。这在Java中非常常见,在这里,MDB使用消息,然后使用数据库或另一个JMS提供程序。所有的工作都是原子性的,所以如果任何一个部分失败(例如MDB使用消息、数据库工作、向另一个提供程序发送消息),那么它们都会失败,以便跨系统的所有数据保持一致。

您似乎在回避XA事务(不确定原因),并手动提交或回滚单个JMS和JDBC事务。数据与这种方法不一致的风险总是很高。您如何处理它将取决于您的具体限制。

要明确的是,您引用的ActiveMQ文档中的伪代码没有使用2阶段提交。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64999086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档