JMS自动重新连接到TOPIC

时间:2014-03-12 15:17:44

标签: java spring jms ibm-mq spring-integration

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

<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>

1 个答案:

答案 0 :(得分:0)

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

启用DEBUG(甚至是TRACE)记录以确定发生了什么。