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