2017-12-15 11 views
0

Ich bin eine Verbindung zu zwei IBM MQ-Servern von einem Client mit JmsTemplate.JmsTemplate mit CachingConnectionFactory Verbindungswiederherstellung für IBM MQ-Warteschlange

Ich habe die reconnectOnException von JmsTemplate sowie setClientReconnectOptions von IBM MQ connection factory konfiguriert.

Spring-Bean-Definition:

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

Set IBM MQ wieder Optionen:

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

Dies ist, wie ich Nachricht sende:

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

Wenn keine der Verbindungen wird Bei niedriger Systemlast wird eine unterbrochene Verbindung zum ersten System von Spring erkannt.

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] 

Dies wirkt irgendwie JmsTemplate Verbindung zum zweiten System, und wenn ich eine Ausnahme ohne Meldung erhalten, verwendet.

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 

Stapelüberwachung

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) 
  • Warum für eine CachingConnectionFactory nicht gebrochen Verbindung seitig beeinflussen?
  • Warum wird die zweite Verbindung nicht von 'Exception' wiederhergestellt? erkennt sie?
  • Muss ich Exception in JmsException für Spring jms umbrechen, um es zu erkennen?
+0

> 'sendMsg: Ausnahmebedingungsnachricht: null' Ich schlage vor, dass Sie die vollständige Stapelverfolgung drucken und die Frage bearbeiten, um sie hinzuzufügen. –

Antwort

0

Wir können den Fehler durch Ändern der Netzwerkverbindungen erstellen.

Wenn die Wiederverbindung des IBM MQ-Clients aktiviert und das Netzwerk geändert wird, werden automatisch Verbindungen unter der Haube aktualisiert. Spring JMS würde diese Aktualisierung nicht immer erkennen und in einen Zustand versetzen, in dem Verbindungen in einer CachingConnectionFactory aktualisiert würden, für andere jedoch nicht.

Ich habe IBM MQ-Clients wiederverbinden, indem Sie setClientReconnectOptions nicht festlegen und Feder alle Verbindungsänderungen und Probleme behandeln lassen. Dies behebt den obigen Fehler.

Verwandte Themen