2014-03-12 76 views
0

我有两个应用程序,一个应用程序正在发布到一个主题,另一个应用程序正在阅读该主题。我们有一个场景,一个队列管理器出现故障,然后再次可用。发布者(不重新启动)在队列管理器重新启动后继续正常工作,但主题使用者在重新启动之前不会从发布者接收新消息。是否有一些配置可以在主题消费者上设置以某种方式刷新其连接?我们正在使用IBM MQ上的java/spring/spring集成。以下是我们的消费者的配置。JMS自动重新连接到主题

<bean id="jmsAlertsServiceMessageListener" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="alertConnectionFactory"/> 
    <property name="destination" ref="alertsServiceTopic"/> 
    <property name="autoStartup" value="false"/> 
    <property name="clientId" value="${ps.Alert.clientId}"/> 
    <property name="taskExecutor" ref="jmsTaskExecutor"/> 
    <property name="subscriptionDurable" value="true"/> 
    <property name="pubSubDomain" value="true"/> 
    <property name="messageSelector" value="AlertState = 'RESOLVED'"/> 
    <property name="messageListener" ref="alertsMessageListener"/> 
    <property name="durableSubscriptionName" value="replay"/> 
    <property name="recoveryInterval" value="30000"/> 
</bean> 

<bean id="alertConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory" > 
    <property name="transportType" value="1" /> 
    <property name="queueManager" value="${alert.mq.qm}" /> 
    <property name="hostName" value="${alert.mq.host}" /> 
    <property name="port" value="${alert.mq.port}" /> 
    <property name="channel" value="${alert.mq.channel}" />  
    <property name="SSLCipherSuite" value="SSL_RSA_WITH_RC4_128_SHA" />   
    <property name="brokerPubQueue" value="${alert.mq.topic_connection_factory_broker_pub_queue}"/> 
    <property name="brokerQueueManager" value="${alert.mq.topic_connection_factory_broker_queue_manager}"/> 
    <property name="providerVersion" value="${alert.mq.topic_connection_factory_provider_version}"/> 
    <property name="brokerVersion" value="1"/>  
    <property name="messageSelection" value="1"/>  
</bean> 

<bean id="alertsServiceTopic" class="com.ibm.mq.jms.MQTopic"> 
    <constructor-arg value="${alert.mq.topic}" /> 
    <property name="brokerDurSubQueue" value="${alert.mq.queue}"/>   
    <property name="brokerVersion" value="1"/>   
</bean> 

<bean id="alertsMessageListener" class="org.springframework.integration.jms.ChannelPublishingJmsMessageListener"> 
    <property name="requestChannel" ref="alertsJmsInputChannel"/> 
</bean> 

<bean id="jmsTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="1"/> 
    <property name="maxPoolSize" value="1"/> 
    <property name="waitForTasksToCompleteOnShutdown" value="true"/> 
    <property name="daemon" value="false"/> 
    <property name="threadNamePrefix" value="jmsInbound-"/> 
    <property name="queueCapacity" value="3"/> 
    <!-- Discard any task that gets rejected. --> 
    <property name="rejectedExecutionHandler"> 
     <bean class="java.util.concurrent.ThreadPoolExecutor$DiscardPolicy"/> 
    </property> 
</bean> 

回答

0

DefaultMessageListenerContainer将根据recoveryInterval自动重新连接。

打开DEBUG(甚至是TRACE)日志记录来弄清楚发生了什么。