Java-процесс с POJO, управляемыми Spring Message Driven, через некоторое время требовал перезапуска, чтобы получать сообщения из MQ
У меня есть процесс Java (1.7), который использует Spring MDP (Spring 4.2.3 JMS framework) для чтения и обработки сообщений из очередей Websphere MQ 8.1, которые работали без проблем в течение нескольких недель; но недавно перестал потреблять сообщения из очереди, пока она не была перезапущена (Java-процесс был запущен и не было никаких исключений / ошибок в журналах). Сообщения просто истекали из очереди после истечения времени ожидания, когда я столкнулся с проблемой. Тот факт, что мне пришлось перезапустить процесс, указывает на проблему где-то... так как я использую только фреймворк Spring, у меня нет никаких подсказок о том, что я могу сделать, чтобы устранить проблему / сузить проблему в случае, если это произойдет снова. Ценю любые предложения по внедрению некоторых диагностических мер.
Я заметил, что процесс java должен был выполнить несколько откатов сообщений обратно в очередь из-за проблемы тайм-аута сети при их обработке в день, когда я столкнулся с проблемой
Я приложил конфигурацию Spring MDP ниже
<!-- WebSphere MQ Connection Factory -->
<bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName">
<value>${mq.wal.queue_hostname}</value>
</property>
<property name="port">
<value>${mq.wal.queue_port}</value>
</property>
<property name="queueManager">
<value>${mq.wal.queue_manager}</value>
</property>
<property name="transportType">
<!-- BINDING MODE -->
<value>${mq.wal.transport_type}</value>
</property>
</bean>
<!-- JMS Queue Connection Factory -->
<bean id="jmsQueueConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory">
<ref bean="mqConnectionFactory" />
</property>
</bean>
<!-- IN queue -->
<bean id="in_queue" class="com.ibm.mq.jms.MQQueue"
depends-on="jmsQueueConnectionFactory">
<property name="baseQueueManagerName" value="${mq.queue_manager}" />
<property name="baseQueueName" value="${mq.inqueue}" />
</bean>
<!-- Error handler -->
<bean id="messageErrorHandler" class="coop.mm.wallet.access.service.MessagingErrorHandler"></bean>
<!-- End error handler -->
<!-- Listener containers for INBOUND Queues -->
<!-- listener container -->
<bean id="listener_container"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsQueueConnectionFactory" />
<property name="destination" ref="in_queue" />
<property name="messageListener" ref="messageListener" />
<property name="sessionTransacted" value="true" />
<property name="concurrency" value="${listener_count}" />
<property name="errorHandler" ref="messageErrorHandler"/>
</bean>