Sping .jms.listener阻止另一个侦听器读取JMS消息

时间:2018-05-26 15:59:08

标签: java spring spring-jms wildfly-10

我有两个应用程序Apple和Pear使用上面的类来监听WildFly(10.1.0)中已配置的JMS队列。 Spring配置如下所示。

<bean id="appleMessageListenerContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"
    depends-on="transactionManager">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="destination" ref="outQueue" />
    <property name="destinationResolver" ref="jmsDestinationResolver" />
    <property name="messageListener" ref="AppleMessageListener" />
    <property name="messageSelector" value="ID='APPLE_ID'" />
    <property name="transactionManager" ref="transactionManager" />
</bean>

<bean id="pearMessageListenerContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"
    depends-on="transactionManager">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="destination" ref="outQueue" />
    <property name="destinationResolver" ref="jmsDestinationResolver" />
    <property name="messageListener" ref="PearMessageListener" />
    <property name="messageSelector" value="ID='PEAR_ID'" />
    <property name="transactionManager" ref="transactionManager" />
</bean>

预期过程如下: -

Apple应用程序监听器(AppleMessageListener)将读取来自&#34; outQueue&#34;的消息。 JMS队列。消息已更新,AppleMessageListener将消息写入&#34; outQueue&#34;将senderId设置为&#34; PEAR_ID&#34;,以便PearMessageListener将读取该消息。 AppleMessageListener将等待来自不同&#34; inQueue&#34;的Pear应用程序的响应。或超时。

不幸的是,发生的事情是AppleMessageListener将消息写入&#34; outQueue&#34;。 AppleMessageListener超时等待响应。只有在超时之后,PearMessageListener才会从&#34; outQueue&#34;中读取消息。就好像AppleMessageListener正在等待响应一样,PearMessageListener无法读取消息。

请问为什么会这样。 谢谢你的帮助。

皮特

1 个答案:

答案 0 :(得分:0)

您的消息选择器似乎实际上并未过滤,并且实际上每个消费者都会从outQueue提供每条消息。 (您可以在创建JMS使用者时检查过滤器是否正确使用吗?)

为了提高吞吐量,您的JMS服务器配置为批量发送消息。为了保证单次传递,将消息发送给第一个消费者(Apple),将其放入本地缓冲区,直到该消费者实际读取(并处理)该消息。在Apple消费者超时(关闭JMS连接)之前,不会向任何其他消费者提供该消息。此时,JMS服务器发现传递的消息未被确认,并将其放回队列中。然后将该消息提供给下一个消费者。

您应该检查邮件是否已正确过滤。 或者,或者,尝试使用不同的队列来发送请求和回复消息。