侦听器错误后错过ActiveMQ主题消息

时间:2015-06-12 16:11:19

标签: spring apache-camel activemq

我有两个独立的进程运行相同的Camel路由消耗来自ActiveMQ主题(即:一个有多个订阅者的主题),偶尔会遇到其中一个消费者的错过消息。我希望两个消费者都收到相同的消息,因此我使用的是主题。

我认为正在发生的事情是,在提交数据库事务时,其中一个消费者错误是因为我看到这样的日志:

WARN  arjuna |  || ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for SynchronizationImple< 0:ffff0a666262:e5aa:557ac1a0:14976, org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization@6dc34434 >
WARN  DefaultJmsMessageListenerContainer |  || Setup of JMS message listener invoker failed for destination 'xxx' - trying to recover. Cause: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
INFO  DefaultJmsMessageListenerContainer |  || Successfully refreshed JMS Connection

看来,正在进行此操作时,另一个进程中的使用者会收到该主题的另一条消息并对其进行处理,但是第一个消费者(记录警告的消费者)未收到第二条消息。

我对Spring消息监听器的内部结构并不熟悉,但是连接刷新是否会暂时使主题订阅消失?这会解释为什么在听众错误后偶尔会错过广播消息吗?

有人有任何建议我可能做错了什么,或者我的期望与主题应该如何表现不一致?

2 个答案:

答案 0 :(得分:0)

也许这些信息对您有帮助:

对于一组按 [A,​​ B, C, D] 顺序到达的消息和两个消费者 C1 和 C2,消息的正态分布如下:

C1: [A, C] C2: [B, D] 由于代理不控制读取进程的工作并且处理顺序是并行的,因此是不确定的。如果 C1 比 C2 慢,那么初始消息集可以处理为 [B, D, A, C]。

这种行为可能会让希望按顺序处理消息并在此基础上构建消息传递应用程序的新手感到惊讶。要求按相对顺序处理同一发件人发送的消息(也称为因果排序)是相当普遍的。

https://habr.com/ru/post/471268/

答案 1 :(得分:0)

您似乎对数据库和 activeMQ 使用了 distributed transaction。只有在数据库事务成功时才会发送消息。因此,数据库中的故障可能会使您的消息失败。

这就是你看到的原因

<块引用>

嵌套异常是 javax.transaction.RollbackException

和:

<块引用>

org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization