活动MQ,在读取时只有一个MessageListener卡住仍会导致队列增长

时间:2016-03-04 09:43:35

标签: spring jms activemq spring-jms

我对ActiveMQ队列有一种奇怪的行为,我无法理解。在ActiveMQ上并不擅长,所以我希望有人可以提供帮助。

我有一个在tomcat中配置的队列。我有一个通过Spring配置的MessageListener,有3个实例。 他们基本上执行HTTP请求,处理答案并将答案放在另一个队列中。

昨天,我遇到了连接问题,因此(SOAP)请求超时。当发生这种情况时,我会抛出一个自定义异常,将其捕获到" onMessage"并在响应队列上发送错误消息。 然后,我可以看到侦听器从队列中取出另一条消息,然后挂起。没有例外或任何事情。为什么会发生这种情况我不确定,我正在调查这一点。

但这是奇怪的事情:

这发生在我的三个MessageListeners中的两个。他们停了下来,但我的第三个人仍然从队列中读出来。但是,在重新启动服务器之前,队列正在增长,并且队列化超过500条消息。

每个悬挂的听众都有一个" dispatchedqueuesize"大约一半。每个。

所以,对我来说,似乎放在队列中的消息变成了#34;保留"对于每个听众,即使他们没有主动从队列中读取。我可以看到"活跃"监听器仍处理消息,那么为什么它不会处理每条消息?我希望听众按照他们进来的顺序阅读消息。如果只留下一个""它应该仍然读取放在队列中的每条消息。为什么不这样做?

指针非常感谢。

编辑:下面的接收端的Spring配置。

<amq:connectionFactory id="refConnectionFactory" brokerURL="${jms.broker.url}" clientID="theclient"/>
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <constructor-arg ref="refConnectionFactory"/>
    <property name="sessionCacheSize" value="10"/>
</bean>

<!-- JmsTemplate Definition -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <constructor-arg ref="connectionFactory"/>
</bean>

<!-- listener container definition using the jms namespace, concurrency is the max number of concurrent listeners that can be started -->
<jms:listener-container concurrency="3">
    <jms:listener id="locationListener" destination="location.out" ref="locationQueryListener"/>
</jms:listener-container>

1 个答案:

答案 0 :(得分:0)

很可能线程挂在代码中的某个地方;使用jstack获取线程转储以查看容器线程正在做什么。