我对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>
答案 0 :(得分:0)
很可能线程挂在代码中的某个地方;使用jstack获取线程转储以查看容器线程正在做什么。