我有一个使用jms的应用程序,该应用程序将数据发送到ActiveMQ Artemis队列。我收到此消息的异常:
事务在故障转移时已回滚,但是提交可能已经成功
此异常基本上是告诉我消息可能已经到达队列或可能尚未到达队列,所以我不知道是否需要再次发送消息。在以下情况下处理此类异常的最佳方法是什么?
和
答案 0 :(得分:1)
我不能说比ActiveMQ Artemis documentation更好:
在从客户端向服务器发送消息,或者实际上从服务器向另一服务器发送消息时,如果目标服务器或连接在发送消息之后但在发件人接收到发送(或提交)响应之前的某个时间失败成功处理后,发件人无法确定邮件是否已成功发送到该地址。
如果目标服务器或连接在接收和处理发送之后失败,但在发送回响应之前失败,则消息将成功发送到该地址,但是如果目标服务器或连接在接收并发送之前失败,并且完成处理后,它将不会成功发送到该地址。从发送者的角度来看,不可能区分这两种情况。
服务器恢复后,这将使客户端陷入困境。它知道目标服务器发生了故障,但是它不知道最后一条消息是否到达了目的地。如果决定重新发送最后一条消息,则可能导致重复的消息发送到该地址。如果每个消息都是订单或交易,那么这可能导致订单被执行两次或交易被重复预订。显然这不是理想的情况。
在事务中发送消息也无济于事。如果在处理事务提交时服务器或连接失败,那么也不确定事务是否成功提交!
为解决这些问题,Apache ActiveMQ Artemis为发送到地址的消息提供了自动重复消息检测。
在ActiveMQ Artemis documentation中了解有关如何配置和使用重复检测的更多详细信息。