Слушатель Spring JMS получает пустые сообщения, вызывающие загрузку процессора
Я работаю над приложением, которое использует пару очередей jms для отправки / получения обновлений в / из внешней системы. Для тестирования моего приложения я использую Mockrunner и, в частности, модуль jms. Я сталкиваюсь со странным поведением: когда я запускаю свое приложение, я вижу, что процессор взлетел до 100%, и, анализируя дампы потоков, я вижу, что основная причина связана с прослушивателями jms, которые у меня выглядят как получение пустых сообщений это вызывает сообщения, такие как:
Consumer ... did not receive a message
Теперь я пытаюсь понять, связана ли проблема с неправильным взаимодействием моего приложения и mockrunner или с ошибкой конфигурации.
Соответствующие части конфигурации:
<bean id="destinationManager" factory-bean="mockRunnerJMSObjectFactory" factory-method="getDestinationManager" />
<bean id="mockJmsConnectionFactory" factory-bean="mockRunnerJMSObjectFactory" factory-method="createMockConnectionFactory" lazy-init="true"/>
и слушатель, который заставляет процессор вращаться бесконечно:
<jms:listener-container concurrency="5" connection-factory="mockJmsConnectionFactory" destination-type="queue" message-converter="myMessageConverter" acknowledge="transacted" >
<jms:listener
id="myListener"
destination="myQueue"
ref="myConsumer"
method="consume"
/>
</jms:listener-container>
<bean id="myConsumer"... />
ОБНОВЛЕНИЕ Я открыл вопрос по проекту Mockrunner, вы можете увидеть его здесь.
1 ответ
После некоторого расследования я обнаружил, что проблема заключается в плохом взаимодействии со Spring DefaultMessageListenerContainer
, Этот прослушиватель имеет реализацию, основанную на опросе, и, учитывая, что проверенная инфраструктура очень быстро реагирует на запросы, вызывает перегрузку ЦП. Я исправил фиктивный бегун, добавив в метод ответа уродливый нить сна, возможно, это будет исправлено рано или поздно.