【发布时间】:2015-08-28 17:38:24
【问题描述】:
我有两个单独的进程运行相同的 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 消息侦听器的内部结构并不熟悉,但是连接刷新瞬间会使主题订阅消失吗?这可以解释为什么在侦听器错误后偶尔会丢失广播消息吗?
是否有人对我可能做错了什么有任何建议,或者我的期望是否与主题的行为方式不一致?
【问题讨论】:
-
那么,当消费者出现一段时间的情绪低落时,预期的行为是什么?
-
你是说第一个消费者失败,JMS事务回滚,第二个消费者收到回滚的消息?
-
如果消息应该为离线的主题侦听器持久化,您需要使用持久主题
-
@DraganBozanovic 我不知道这个问题的答案!
-
@lkmac 不,第一个消费者在一条消息上失败,然后第二个消费者收到第一个没有的消息
标签: spring apache-camel activemq