2017-12-15 19 views
0

JmsTemplate을 사용하여 동일한 클라이언트에서 두 개의 IBM MQ 서버에 연결하고 있습니다.JmsTemplate with CachingConnectionFactory IBM MQ 큐용 연결 복구

IBM MQ 연결 팩토리의 setClientReconnectOptions뿐만 아니라 JmsTemplate의 reconnectOnException도 구성했습니다.

스프링 빈 정의 :

<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가 다시 연결 옵션 :

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

이 내가 메시지를 보내고 방법입니다 연결 중 어느 것도 존재하지

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

낮은 시스템로드 중에 사용되면 첫 번째 시스템에 대한 연결 끊김이 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) 
  • 왜 하나 CachingConnectionFactory에 대한 깨진 연결 다른 영향을 미치는가?
  • 두 번째 연결이 '예외'에서 복구되지 않는 이유는 무엇입니까?
  • jmsException을 봄 jms로 감싸기 위해 예외를 감쌀 필요가 있습니까?
+0

>'sendMsg : Exception message : null' 전체 스택 추적을 인쇄하고 질문을 편집하여 추가하는 것이 좋습니다. –

답변

0

네트워크 연결을 변경하여 오류를 만들 수 있습니다.

IBM MQ 클라이언트의 재 연결이 켜져 있고 네트워크가 변경되면 자동으로 연결이 새로 고쳐집니다. Spring JMS는 항상이 새로 고침을 인식하지 못해 하나의 CachingConnectionFactory의 연결이 새로 고쳐지지만 다른 연결은 새로 고쳐지지 않는 상태로 만들 것입니다.

IBM MQ 클라이언트는 setClientReconnectOptions을 설정하지 않음으로써 다시 연결을 해제하고 모든 연결 변경 사항과 문제점을 처리하도록합니다. 위의 오류가 수정되었습니다.