2015-03-12 3 views
0

Я должен исправить унаследованное приложение от другой компании, и у меня есть ошибка, которая мне не понятна: слушатель jms перестает работать без всякой очевидной причины.ActiveMQ Spring прослушиватель suddently перестает работать

Это клиент пружинной основе, здесь есть контекст:

<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" > 
    <property name="useAsyncSend" value="false" /> 
    <property name="useCompression" value="true" /> 
    <property name="optimizeAcknowledge" value="true" /> 
    <property name="messagePrioritySupported" value="true" /> 
    <property name="brokerURL" value="failover:(tcp://${brokerHost}:61616)?timeout=3000&jms.redeliveryPolicy.maximumRedeliveries=-1&jms.redeliveryPolicy.maximumRedeliveryDelay=1000000&jms.redeliveryPolicy.useExponentialBackOff=true" /> 
    <property name="maxThreadPoolSize" value="60" /> 
    <property name="closeTimeout" value="2000" /> 
    <property name="nonBlockingRedelivery" value="true" /> 
    <property name="exclusiveConsumer" value="false" /> 
</bean> 

<bean id="jmsConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" > 
    <property name="connectionFactory" ref="amqConnectionFactory" /> 
    <property name="maxConnections" value="50" /> 
    <property name="maximumActiveSessionPerConnection" value="100" /> 
    <property name="idleTimeout" value="20000" /> 
    <property name="expiryTimeout" value="15000" /> 
</bean> 

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate" abstract="true"> 
    <property name="connectionFactory" ref="jmsConnectionFactory"/> 
    <property name="explicitQosEnabled" value="true"/> 
    <property name="sessionTransacted" value="true" /> 
    <property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE" /> 
    <property name="receiveTimeout" value="4000" /> 
</bean> 

<bean id="actionsJmsTemplate" parent="jmsTemplate"> 
    <property name="defaultDestination" ref="actionPendingDestination"/> 
</bean> 

<bean id="jmsActionsListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="jmsConnectionFactory"/> 
    <property name="destination" ref="actionPendingDestination"/> 
    <property name="messageSelector" value="" /> 
    <property name="messageListener" ref="actionsListener" /> 
    <property name="sessionTransacted" value="true"/> 
    <property name="cacheLevelName" value="CACHE_SESSION" /> 
    <property name="maxConcurrentConsumers" value="50" /> 
    <!-- <property name="transactionManager" ref="transactionManager" /> --> 
    <property name="transactionTimeout" value="1000" /> 
</bean> 

<!-- ActiveMQ Destinations --> 
<bean id="actionPendingDestination" class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg index="0" value="actions.pending.queue.>"/> 

боб «actionsListener», который обрабатывает сообщения внутри приложения, реализует javax.jms.MessageListener и org.springframework.beans. factory.BeanNameAware. И он не делает ничего подобного признанию сеанса или управлению транзакцией. В этом классе нет такого кода.

В версии библиотек:

  • Весна: 3.2.5.RELEASE
  • ActiveMQ клиент: 5,9
  • JDK: 1,6

Видите ли вы какие-либо проблемы с этим конфигурация?

Спасибо!

Carlos

+0

Сколько сообщений обрабатывается до того, как он перестанет работать? – Tim

ответ

0

Я вижу это с помощью CLIENT_ACKNOWLEDGE; подтвердили ли вы, что ack происходит на всех кодах (включая исключения)? Это было какое-то время, но я думаю, что произойдет, если вы не делаете никаких сообщений, так это то, что вы можете обрабатывать только свой буфер предварительной выборки, поэтому, как только вы не сможете сделать это, вы закончите.

+0

Вот что я подозреваю, хотя я не уверен, что это связано с весной. Кроме того, как вы можете видеть, сеанс транслируется, и я не уверен, влияет ли это на режим подтверждения ... Я посмотрю на префиксный буфер, как только мы сможем запустить систему, это происходит только в производство, так что это немного сложно: S Спасибо! –

+0

Если вы можете найти способ воспроизводить его последовательно в тестовой среде, вы можете попробовать установить режим ack на AUTO_ACK, чтобы убедиться, что это устранило проблему. (Это, по крайней мере, подтвердит, является ли проблема отказом для сообщений.) – Tim

+0

Как я могу проверить размер буфера предварительной выборки потребителя? Кроме того, потребитель с полным буфером предварительной выборки считается параллельным потребителем? Если это так, если только 10 потребителей получают свои буферы, они блокируют потребление сообщений. –

Смежные вопросы