2013-08-12 279 views
7

我们正面临着ActiveMQ及其消费者的随机问题。我们观察到,即使连接到ActiveMQ队列,很少消费者也没有收到消息。但消费者重新启动后,它工作正常。消费者未收到来自ActiveMQ的消息

我们有一个在侧面的ActiveMQ名为testQueue队列。消费者试图从这个队列中排列消息。我们正在使用Spring的DefaultMessageListenerContainer来达到这个目的。消息正从ActiveMQ Broker传送到消费者节点。从tcpdump也很明显,消息正在到达消费者节点,但实际的消费者代码无法看到消息。换句话说,消息似乎停留在ActiveMQ使用者代码或Spring的DefaultMessageListenerContainer中。

请参阅下图。以更清楚地解决这个问题。消息正在到达Consumer节点,但未达到“实际消费者类别”,这意味着该消息陷入AMQ消费者代码或Spring DMLC中。

enter image description here

以下是ActiveMQ的管理拍摄的所有细节。

队列名称/待-消息计数/消费者计数/信息-入队/消息 - 已出列 testQueue/9/1/9/0

以下是在更多的细节。

连接ID/SessionID的/选择/排入/队列中取出/调度/调度-队列/预取 ID:bearsvir52-45176-1375519181268-3:5/1// 9/0/9 /二百五十○分之九

从第二张表中可以明显看出,消息正在传递给消费者,但消费者没有确认消息。因此,这些消息被卡在代理端的Dispatched-Queue中。

为你们注意几点:

1)没有时间差的B/W代理节点和消费者节点。

2)观察到消费者侧tcpdump的。我们可以看到MessageDispatch(Openwire)数据包被传输到消费者节点,但是找不到MessageAck(Openwire)。

3)有时它是工作在一个节点上,有时它是在相同的节点上创建的问题。的这个

+0

你能张贴在Spring配置,显示ConectionFactory,叶准直器和监听器类? –

+0

我面对完全相同的问题。你有没有得到解决方案? –

+0

有没有更新?我有一个类似的问题 – Nereis

回答

2

花了很多时间来找出解决方案。在AMQ故障转移的情况下,似乎有一些问题与org.apache.activemq.ActiveMQConnection.java类有关。在这种情况下,连接对象不在消费者一方开始。

以下是我在ActiveMQConnection.java文件中添加的修复程序,并编译了源以创建activemq-core-x.x.x。罐子

private final Object startMutex = new Object(); 

加入了createSession方法检查

public Session createSession(boolean transacted, int acknowledgeMode) throws JMSException { 
    synchronized (startMutex) { 
     if(!isStarted()) { 
      start(); 
     } 
    } 
1

一个原因可以是不正确地使用CachingConnectionFactory(带有缓存消费者)与听者容器动态调整消费者(最大消费者>消费者)。您最终可能只是坐在游泳池中而不被积极使用的缓存消费者。您永远不需要使用侦听器容器来缓存消费者。

对于这样的问题,我一般建议用跟踪记录运行,你可以看到所有的消费活动。

相关问题