У меня есть клиент на основе Spring JMS, который асинхронно прослушивает «триггеры» на QUEUE1, они указывают, что есть сообщение, готовое для использования в другой очереди, QUEUE2.
Потребление в QUEUE2 осуществляется с помощью класса JmsTemplate, настроенного следующим образом:
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="gpyConnectionFactory" />
<property name="destinationResolver" ref="jndiDestinationResolver" />
<property name="receiveTimeout" value="100" />
</bean>
Обратите внимание на небольшой параметр receiveTimeout. Это значение уже было таким, прежде чем взять на себя ответственность за это приложение.
СЕЙЧАС я заметил, что иногда, особенно когда QUEUE2 содержит относительно большое сообщение, вызов
jmsTemplate.receiveSelectedAndConvert(destinationName, mqSelector);
извлекает объект NULL, поэтому вполне вероятно, что время ожидания истекло!
Насколько мне известно, согласно спецификации JMS (поправьте меня, если я ошибаюсь) тайм-аут истечет, только если в очереди нет доступных сообщений. Текущий сценарий заставляет меня поверить, что из-за размера сообщения и из-за того, что наверняка есть сообщение в этой очереди, тайм-аут истекает, потому что у потребителя нет достаточно времени, чтобы прочитать все большое сообщение. Возможно ли все это?
Поставщик - WebSphere MQ.
Обязательно установлю большее значение тайм-аута.