Sping .jms.listener блокирует другого слушателя от чтения сообщения JMS - PullRequest
0 голосов
/ 26 мая 2018

У меня есть два приложения Apple и Pear, которые используют вышеупомянутый класс для прослушивания настроенной очереди JMS в WildFly (10.1.0).Конфигурация 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) будет читать сообщение из очереди JMS outQueue.Сообщение обновляется, и AppleMessageListener записывает сообщение в «outQueue» с senderId, установленным в «PEAR_ID», так что PearMessageListener будет читать сообщение.AppleMessageListener будет ожидать ответа от приложения Pear на другой «inQueue» или тайм-аут.

К сожалению, происходит то, что AppleMessageListener записывает сообщение в «outQueue».Тайм-аут AppleMessageListener ожидает ответа.Только после этого таймаута PearMessageListener считывает сообщение из «outQueue».Это как если бы AppleMessageListener ожидал ответа, PearMessageListener не может прочитать сообщение.

Любые мысли о том, почему это так, пожалуйста.Спасибо за вашу помощь.

Пит

1 Ответ

0 голосов
/ 26 мая 2018

Кажется, что ваши селекторы сообщений на самом деле не фильтруются, и каждому потребителю фактически предлагается каждое сообщение из outQueue.(Вы можете проверить, правильно ли используется фильтр при создании потребителя JMS?)

Чтобы увеличить пропускную способность, ваш JMS-сервер настроен на отправку сообщений в пакетном режиме.Чтобы гарантировать однократную доставку, сообщение передается первому потребителю (Apple), который помещает его в локальный буфер, пока этот потребитель фактически не прочитает (и не обработает) сообщение.Сообщение не предлагается никакому другому потребителю, пока не истечет время ожидания потребителя Apple (соединение JMS закрывается).В этот момент сервер JMS обнаруживает, что доставленное сообщение не подтверждено, и помещает его обратно в очередь.Затем сообщение предлагается следующему потребителю.

Необходимо проверить, правильно ли отфильтрованы сообщения.Или, в качестве альтернативы, попробуйте использовать разные очереди для отправки запроса и ответных сообщений.

...