Spring Integration通过JBOSS资源适配器自动重新连接到IBM MQ

时间:2015-10-23 17:37:23

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

我们在项目中使用Spring Integration,我们有一个要求,如果IBM MQ出现问题,那么我们将不得不在IBM MQ启动时自动连接到它。我们使用recoveryInterval类的org.springframework.jms.listener.DefaultMessageListenerContainer选项完成了此实现。我们已经给出了恢复间隔值以尝试恢复MQ连接。但是在MQ重启后它没有恢复连接。以下是我现有的配置:

       <jms:message-driven-channel-adapter id="adapterId" channel="raw-channel" container="messageListenerContainer" />


        <bean id="messageListenerContainer"  class="org.springframework.jms.listener.DefaultMessageListenerContainer">
                <property name="connectionFactory" ref="customQueueCachingConnectionFactory" />
                <property name="destination" ref="requestQueue" />
                <property name="recoveryInterval" value="60000" />
            </bean>

    Below is the Current Connection Factory :
    <bean id="queueCachingConnectionFactory"
            class="org.springframework.jms.connection.CachingConnectionFactory">
            <property name="targetConnectionFactory" ref="queueConnectionFactory" />
            <property name="sessionCacheSize" value="10" />
            <property name="cacheProducers" value="false" />
    <!--        <property name="reconnectOnException" value="true" /> -->
    <!--        <property name="exceptionListener" ref="MQExceptionListener"></property> -->
        </bean>

        <jee:jndi-lookup id="queueConnectionFactory" jndi-name="MQConnectionFactory"
            expected-type="javax.jms.ConnectionFactory" lookup-on-startup="true"></jee:jndi-lookup>


        <jee:jndi-lookup id="queue" jndi-name="Queue"
            expected-type="javax.jms.Queue" lookup-on-startup="true"/>
ERROR [task-scheduler-4] LoggingHandler:145 -org.springframework.jms.IllegalStateException: MQJCA1019: The connection is closed.; nested exception is com.ibm.msg.client.jms.DetailedIllegalStateException: MQJCA1019: The connection is closed.
    The application attempted to use a JMS connection after it had closed the connection.
    Modify the application so that it closes the JMS connection only after it has finished using the connection.

先谢谢!!

1 个答案:

答案 0 :(得分:0)

默认消息侦听容器应引用缓存连接工厂:

 <!-- caching connection factory fascade, also implements exception listener -->
<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
   <property name="targetConnectionFactory" ref="connectionFactory"/>
   <property name="sessionCacheSize" value="10"/>
   <property name="reconnectOnException" value="true"/>
</bean>

<!-- this is the Message Driven POJO (MDP) -->
<bean id="messageDrivenPOJO" class="com.redhat.gss.spring.MessageDrivenPOJO" />

<!-- The message listener container -->
<bean id="messageListener" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
   <property name="sessionTransacted" value="true"/>
   <property name="concurrentConsumers" value="1"/>
   <property name="cacheLevelName" value="CACHE_CONSUMER"/>                
   <property name="receiveTimeout" value="10000"/>
   <property name="sessionAcknowledgeMode" value="2"/>
   <property name="messageListener" ref="messageDrivenPOJO"/>
   <property name="connectionFactory" ref="cachingConnectionFactory"/>
   <property name="exceptionListener" ref="cachingConnectionFactory"/>
   <property name="destination" ref="jbossQueue"/>
</bean>