为什么在int-jms:outbound-channel-adapter中出现MQException时没有调用errorChannel?

时间:2019-06-07 16:01:55

标签: java spring-integration

Jms outbound-channel-adapter可以很好地工作,但是我间歇性地在日志中看到此错误,但是,MQ消息仍然得到传递。

2019-06-07 10:16:22 [JMSCCThreadPoolWorker-5]信息o.s.j.c.CachingConnectionFactory-遇到JMSException-重置基础JMS连接 com.ibm.msg.client.jms.DetailedJMSException:JMSWMQ1107:发生此连接问题。         在com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:578)         在com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:214)         在com.ibm.msg.client.wmq.internal.WMQConnection.consumer(WMQConnection.java:794)         在com.ibm.mq.jmqi.remote.api.RemoteHconn.callEventHandler(RemoteHconn.java:2903)         在com.ibm.mq.jmqi.remote.api.RemoteHconn.driveEventsEH(RemoteHconn.java:628)         在com.ibm.mq.jmqi.remote.impl.RemoteDispatchThread.processHconn(RemoteDispatchThread.java:691)         在com.ibm.mq.jmqi.remote.impl.RemoteDispatchThread.run(RemoteDispatchThread.java:233)         在com.ibm.msg.client.commonservices.workqueue.WorkQueueItem.runTask(WorkQueueItem.java:263)         在com.ibm.msg.client.commonservices.workqueue.SimpleWorkQueueItem.runItem(SimpleWorkQueueItem.java:99)         在com.ibm.msg.client.commonservices.workqueue.WorkQueueItem.run(WorkQueueItem.java:284)上         在com.ibm.msg.client.commonservices.workqueue.WorkQueueManager.runWorkQueueItem(WorkQueueManager.java:312)         在com.ibm.msg.client.commonservices.j2se.workqueue.WorkQueueManagerImplementation $ ThreadPoolWorker.run(WorkQueueManagerImplementation.java:1214) 引起原因:com.ibm.mq.MQException:JMSCMQ0001:WebSphere MQ调用失败,compcode为“ 2”(“ MQCC_FAILED”),原因为“ 2009”(“ MQRC_CONNECTION_BROKEN”)。

...这是errorChannel配置:

<int:header-enricher id="errorMsg.HeaderEnricher"
    input-channel="errorChannel"
    output-channel="omniAlertsJmsErrorChannel">

...并且配置了jms outbound-channel-adapter:

<int-jms:outbound-channel-adapter
    id="jmsOutToNE" channel="umpAlertNotificationJMSChannel" 
    destination="senderTopic" 
    jms-template="jmsQueueTemplate" 
    >

我希望 omniAlertsJmsErrorChannel 会收到 MessageHandlingException ,这不是从 jmsOutToNE 适配器发生的。所有其他通道/流错误都将路由到 omniAlertsJmsErrorChannel

还想知道当 com.ibm.mq.MQException 发生并且在随后的尝试中成功时,是否在内部重试jms outbound-channel-adapter?

1 个答案:

答案 0 :(得分:0)

errorChannel中的MessageHandler已停用。他们的异常只是抛出给调用者。要处理这些异常,您需要考虑在request-handler-advice-chain中添加ExpressionEvaluatingRequestHandlerAdvice。或者,如果我们谈论的是重试,您还可以在该链中添加RequestHandlerRetryAdvice

Reference Manual中查看更多信息。

虽然不确定为什么您的消息仍然传递到MQ。 <int-jms:outbound-channel-adapter中没有开箱即用的重试功能。这可能是IBM库中MQ Connection Factory适配器的行为。