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로 감싸기 위해 예외를 감쌀 필요가 있습니까?
>'sendMsg : Exception message : null' 전체 스택 추적을 인쇄하고 질문을 편집하여 추가하는 것이 좋습니다. –