【发布时间】:2021-03-07 23:29:06
【问题描述】:
在我的应用程序中,我从 JMS 读取数据并写入数据库。为了处理这种情况the ActiveMQ documentation 有以下内容:
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 会话。但是我们的数据库提交已经完成。由于我们回滚了 jms 会话,队列将再次将该数据发送给消费者,这将导致数据库中的数据重复。我们在 ActiveMQ Artemis 队列上的故障转移场景中遇到过这种情况。有没有另一种方法可以处理这个问题而不会导致数据库重复或数据丢失?
【问题讨论】:
-
您已经排除使用 XA 了吗?另外,当您说“两阶段提交”时,您指的是 XA 还是其他东西?如果您不使用 XA,那么您实际上并没有使用两阶段提交。请澄清。
标签: database transactions jms activemq-artemis