Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 在活动MQ中,许多MessageListener中只有一个在读取时卡住,仍然会导致队列增长_Spring_Jms_Activemq_Spring Jms - Fatal编程技术网

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

Spring 在活动MQ中,许多MessageListener中只有一个在读取时卡住,仍然会导致队列增长,spring,jms,activemq,spring-jms,Spring,Jms,Activemq,Spring Jms,我无法理解ActiveMQ队列上的奇怪行为。不太擅长ActiveMQ,所以我希望有人能帮上忙 我有一个队列,在tomcat中配置。我通过Spring配置了一个MessageListener,它有3个实例。 他们基本上做一个HTTP请求,处理答案并将答案放在另一个队列中 昨天,我遇到了连接问题,所以(SOAP)请求超时。发生这种情况时,我抛出一个自定义异常,在“onMessage”中捕获它,并在响应队列上发送一条错误消息。 然后我可以看到侦听器从队列中删除了另一条消息,然后挂起。没有例外。为什么会

我无法理解ActiveMQ队列上的奇怪行为。不太擅长ActiveMQ,所以我希望有人能帮上忙

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

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

但奇怪的是:

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

被挂起的两个侦听器的“dispatchedqueuesize”大约为每个侦听器的一半

因此,对我来说,似乎放在队列上的消息对于每个侦听器都是“保留”的,即使它们没有主动地从队列中读取。我可以看到“活动”侦听器仍在处理消息,所以为什么它不处理每条消息??我希望听众只是按照他们输入的顺序阅读信息。如果只剩下一条“消息”,它仍然应该读取队列中的每条消息。为什么它不这么做

非常感谢你的指点

编辑:下面是接收端的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>


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

当然可以,但它不能解释队列为什么会不断增长。发回重审的听者继续阅读,但似乎只阅读了大约三分之一的信息,它应该阅读每一条。在其他地方得到提示,可能是因为预回迁设置。我要看看这个。