Spring 侦听器错误后缺少ActiveMQ主题消息
我有两个单独的进程运行相同的Camel路由,从ActiveMQ主题(即:具有多个订阅者的主题)进行消费,并且偶尔在其中一个消费者上遇到丢失的消息。我希望两个消费者都能收到相同的消息,因此我使用了一个主题 我认为发生的情况是,其中一个使用者在提交其数据库事务时出错,因为我看到这样的日志:Spring 侦听器错误后缺少ActiveMQ主题消息,spring,apache-camel,activemq,Spring,Apache Camel,Activemq,我有两个单独的进程运行相同的Camel路由,从ActiveMQ主题(即:具有多个订阅者的主题)进行消费,并且偶尔在其中一个消费者上遇到丢失的消息。我希望两个消费者都能收到相同的消息,因此我使用了一个主题 我认为发生的情况是,其中一个使用者在提交其数据库事务时出错,因为我看到这样的日志: WARN arjuna | || ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for SynchronizationImple<
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
WARN arjuna | | | arjuna01225:TwoPhaseCoordinator.before completion-同步失败imple<0:ffff0a66262:e5aa:557ac1a0:14976,org.hibernate.engine.transaction.synchronization.internal。RegisteredSynchronization@6dc34434 >
警告DefaultJmsMessageListenerContainer | | | |为目标“xxx”设置JMS消息侦听器调用程序失败-正在尝试恢复。原因:JTA事务意外回滚(可能是由于超时);嵌套异常为javax.transaction.RollbackException:ARJUNA016053:无法提交事务。
INFO DefaultJmsMessageListenerContainer | | |已成功刷新JMS连接
在这一过程中,另一个进程中的使用者似乎会收到来自主题的另一条消息并对其进行处理,但是第一个使用者(记录警告的使用者)不会收到第二条消息
我对Spring消息侦听器的内部结构还不太熟悉,但是连接刷新是否会瞬间使主题订阅消失?这能解释为什么在侦听器出错后广播消息偶尔会丢失吗
是否有人对我可能做错的地方有任何建议,或者我的期望与主题的表现不符?也许这些信息可以帮助您: 对于按[a、B、C、D]顺序到达的一组消息以及两个消费者C1和C2,消息的正态分布如下所示: C1:[A,C] C2:[B,D] 由于代理不控制读取进程的工作,并且处理顺序是并行的,因此它是不确定的。如果C1比C2慢,则初始消息集可以处理为[B,D,A,C] 这种行为可能会让新手感到惊讶,他们希望消息按顺序处理,并在此基础上构建消息传递应用程序。要求以相对顺序处理同一发送者发送的消息,也称为因果顺序,这一要求相当普遍
看来您正在使用数据库和activeMQ的。仅当数据库事务成功时,才会发送该消息。因此,数据库中的故障可能会使消息失败 这就是你看到的原因 嵌套异常是javax.transaction.RollbackException 以及: org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization
那么,当消费者下跌一段时间时,预期的行为是什么?你是说第一个消费者失败了,JMS事务回滚,第二个使用者接收到回滚的消息?如果消息对于主题侦听器是持久的,则需要使用持久主题offline@DraganBozanovic我不知道那个问题的答案@lkmac否,第一个消费者在一条消息上失败,然后第二个消费者接收到一条消息,第一个消费者没有发送,但OP正在使用广播发送给所有消费者。而且可能不会说俄语:)