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