2017-12-15 21 views
0

JmsTemplateを使用して同じクライアントから2つのIBM MQサーバーに接続しています。JmsTemplate with CachingConnectionFactory IBM MQキューの接続回復

私はJmsTemplateのreconnectOnExceptionとIBM MQ接続ファクトリのsetClientReconnectOptionsを設定しました。

のSpring Bean定義:

<bean id="firstMQCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> 
     <property name="targetConnectionFactory" ref="firstMQConnectionFactory" /> 
     <property name="sessionCacheSize" value="20" /> 
     <property name="reconnectOnException" value="true"/> 
</bean> 

<bean id="secondMQCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> 
     <property name="targetConnectionFactory" ref="secondMQConnectionFactory" /> 
     <property name="sessionCacheSize" value="20" /> 
     <property name="reconnectOnException" value="true"/> 
</bean> 

設定IBM MQは、オプションを再接続:接続のどれもされていないとき

public boolean sendMsg(final String content) throws JmsException{ 
    boolean success = false; 
    LOGGER.info("sendMsg: Start ") ; 
    try { 
     jmsTemplate.send(new MessageCreator() { 
      @Override 
      public Message createMessage(Session session) throws JMSException { 
       TextMessage textMessage = session.createTextMessage(content); 
       textMessage.setStringProperty(WMQConstants.JMS_IBM_CHARACTER_SET, "UTF8"); 
       textMessage.setIntProperty(WMQConstants.JMS_IBM_ENCODING, 
         WMQConstants.WMQ_ENCODING_NATIVE); 
       textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); 
       return textMessage; 
      } 
     }); 
     LOGGER.info("sendMsg: Message sent to MQ successfully"); 
     success = true; 
    } catch (JmsException je) { 
     LOGGER.error("sendMsg: JmsException " + je.getMessage()); 
     throw je; 
    } catch (Exception exc) { 
     LOGGER.error("sendMsg: Exception message: " + exc.getMessage()); 
     throw exc; 
    } 
    return success; 
} 

firstMQConnectionFactory.setClientReconnectOptions(WMQConstancs.WMQ_CLIENT_RECONNECT; 
firstMQConnectionFactory.setClientReconnectTimeout(5); 
secondMQConnectionFactory.setClientReconnectOptions(WMQConstancs.WMQ_CLIENT_RECONNECT; 
secondMQConnectionFactory.setClientReconnectTimeout(5); 

これは、私がメッセージを送信しています方法ですシステム負荷が低いときに使用され、最初のシステムへの接続が壊れたことがSpringによって検出されます。

18 Nov 2017 20:41:03,924 WARN CachingConnectionFactory:322 - Encountered a JMSException - resetting the underlying JMS Connection 
com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ1107: A problem with this connection has occurred. 
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2009' ('MQRC_CONNECTION_BROKEN'). 
18 Nov 2017 20:41:03,940 DEBUG CachingConnectionFactory:486 - Closing cached Session: [email protected] 
18 Nov 2017 20:41:04,006 DEBUG CachingConnectionFactory:447 - Closing shared JMS Connection: [email protected] 
18 Nov 2017 20:41:04,008 DEBUG CachingConnectionFactory:463 - Could not close shared JMS Connection 
com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ0019: Failed to disconnect from queue manager 'QM1' using connection mode '1' and host name 'system1.company.com(62305)'. 
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2009' ('MQRC_CONNECTION_BROKEN'). 
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2009;AMQ9208: Error on receive from host 'system1.company.com/10.0.0.1:62305 (system1.company.com)'. [1=-1,2=ffffffff,3=system1.company.com/10.0.0.1:62305 (system1.company.com),4=TCP] 

これは何とか第二のシステムとするときに使用される、私はメッセージなしで例外を取得するJmsTemplate接続に影響を与えます。

18 Nov 2017 23:43:40,247 DEBUG JmsTemplate:482 - Executing callback on JMS Session: Cached JMS Session: [email protected] 
18 Nov 2017 23:43:40,248 DEBUG JmsTemplate:595 - Sending created message: 
18 Nov 2017 23:43:40,251 ERROR MessageSender:86 - sendMsg: Exception message: null 

スタックトレース

java.lang.NullPointerException 
    at com.ibm.mq.jmqi.remote.impl.RemoteSession.checkIfDisconnected(RemoteSession.java:249) 
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiPutMessageWithProps(RemoteFAP.java:9045) 
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiPut(RemoteFAP.java:8115) 
    at com.ibm.mq.ese.jmqi.InterceptedJmqiImpl.jmqiPut(InterceptedJmqiImpl.java:624) 
    at com.ibm.mq.ese.jmqi.ESEJMQI.jmqiPut(ESEJMQI.java:635) 
    at com.ibm.msg.client.wmq.internal.WMQMessageProducer$SpiIdentifiedProducerShadow.sendInternal(WMQMessageProducer.java:864) 
    at com.ibm.msg.client.wmq.internal.WMQMessageProducer$ProducerShadow.send(WMQMessageProducer.java:548) 
    at com.ibm.msg.client.wmq.internal.WMQMessageProducer.send(WMQMessageProducer.java:1393) 
    at com.ibm.msg.client.jms.internal.JmsMessageProducerImpl.sendMessage(JmsMessageProducerImpl.java:851) 
    at com.ibm.msg.client.jms.internal.JmsMessageProducerImpl.synchronousSendInternal(JmsMessageProducerImpl.java:2051) 
    at com.ibm.msg.client.jms.internal.JmsMessageProducerImpl.sendInternal(JmsMessageProducerImpl.java:1989) 
    at com.ibm.msg.client.jms.internal.JmsMessageProducerImpl.send(JmsMessageProducerImpl.java:1569) 
    at com.ibm.mq.jms.MQMessageProducer.send(MQMessageProducer.java:321) 
    at org.springframework.jms.connection.CachedMessageProducer.send(CachedMessageProducer.java:181) 
    at sun.reflect.GeneratedMethodAccessor120.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.jms.connection.CachedMessageProducer$Jms2MessageProducerInvocationHandler.invoke(CachedMessageProducer.java:293) 
    at com.sun.proxy.$Proxy59.send(Unknown Source) 
    at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:626) 
    at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:597) 
    at org.springframework.jms.core.JmsTemplate$3.doInJms(JmsTemplate.java:562) 
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:484) 
    at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:559) 
    at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:550) 
  • はなぜ1 CachingConnectionFactoryのための壊れた接続が 他に影響しますか?
  • なぜ、2番目の接続が「例外」から復旧しないのですか?
  • spring jmsがそれを検出するためにJmsExceptionでExceptionをラップする必要がありますか?
+0

> 'sendMsg:例外メッセージ:null'完全なスタックトレースを出力し、質問を編集して追加することをお勧めします。 –

答えて

0

ネットワーク接続を変更するとエラーが発生する可能性があります。

IBM MQクライアントの再接続がオンになり、ネットワークが変更されると、自動的に接続がリフレッシュされます。 Spring JMSはこのリフレッシュを必ずしも認識せず、1つのCachingConnectionFactory内の接続がリフレッシュされるが、他のものではない状態に置かれます。

IBM MQクライアントの再接続を無効にするには、setClientReconnectOptionsを設定せずに、すべての接続の変更と問題を処理します。これにより、上記のエラーが修正されました。

関連する問題