2014-03-12 78 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)日誌記錄來弄清楚發生了什麼。