ActiveMQ Spring监听器突然停止工作

时间:2015-03-12 14:46:11

标签: java spring activemq

我必须从另一家公司修复一个继承的应用程序,我有一个错误,我不清楚:jms监听器突然停止工作而没有任何明显的原因。

这是一个基于春天的客户,这里是上下文:

    <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.>"/>

处理应用程序内部消息的bean“actionsListener”实现了javax.jms.MessageListener和org.springframework.beans.factory.BeanNameAware。它不会做任何事情,比如确认会话或管理交易。那个班里没有类似的代码。

库的版本是:

  • Spring:3.2.5.RELEASE
  • ActiveMQ客户端:5.9
  • JDK:1.6

您认为此配置有任何问题吗?

谢谢!

卡洛斯

1 个答案:

答案 0 :(得分:0)

我看到它使用CLIENT_ACKNOWLEDGE;你确认ack发生在所有代码路径上(包括例外)吗?它已经有一段时间了,但我认为如果你不发消息就会发生的事情是你只能处理你的预取缓冲区值,所以一旦你没有做出那么多的ack,你就会完成。