当 replyTo 设置为不存在时无限 JMS 消息重新传递循环 queue
Infinite JMS message redelivery loop when replyTo set to nonexistent queue
鉴于我在 IBM WebSphere AS 8.5.5.9 中有应用程序 运行,通过 JMS(通过 JNDI 解析)连接到 IBM WebSphere MQ 7.0,使用 spring-integraion-jms(4.2.5) inbound-gateway配置如下:
<int-jms:inbound-gateway id="requestGateway"
connection-factory="jndiConnectionFactory"
request-destination="jndiQueueInput"
request-channel="channel.request.message"
reply-channel="channel.response.message"
default-reply-destination="jndiQueueOutput"
error-channel="errorChannel"/>
入站消息已处理,状态回复消息到达通道 channel.response.message
。
当入站消息在异常引发后有不正确的 jms_replyTo
header(即 non-existent queue)时,忽略 error-channel 设置(正确处理集成流程期间的任何其他异常):
WARN o.s.j.l.DefaultMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
com.ibm.msg.client.jms.DetailedInvalidDestinationException: JMSWMQ2008: Failed to open MQ queue 'BLABLABLA'.
at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:498)
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:216)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.checkJmqiCallSuccess(WMQMessageProducer.java:1086)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.checkJmqiCallSuccess(WMQMessageProducer.java:1044)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.access0(WMQMessageProducer.java:71)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer$SpiIdentifiedProducerShadow.initialise(WMQMessageProducer.java:790)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.<init>(WMQMessageProducer.java:1020)
at com.ibm.msg.client.wmq.internal.WMQSession.createProducer(WMQSession.java:926)
at com.ibm.msg.client.jms.internal.JmsSessionImpl.createProducer(JmsSessionImpl.java:1323)
at com.ibm.mq.jms.MQSession.createProducer(MQSession.java:682)
at com.ibm.ejs.jms.JMSMessageProducerHandle.<init>(JMSMessageProducerHandle.java:134)
at com.ibm.ejs.jms.JMSSessionHandle.createProducer(JMSSessionHandle.java:1869)
at org.springframework.integration.jms.ChannelPublishingJmsMessageListener.sendReply(ChannelPublishingJmsMessageListener.java:464)
at org.springframework.integration.jms.ChannelPublishingJmsMessageListener.onMessage(ChannelPublishingJmsMessageListener.java:358)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:721)
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:681)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:651)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:315)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:253)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1158)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1150)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1047)
at java.lang.Thread.run(Thread.java:785)
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2085' ('MQRC_UNKNOWN_OBJECT_NAME').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:204)
... 21 common frames omitted
然后消息被回滚并重新传送,从而形成无限循环。
除了 Handling poison messages in WebSphere MQ classes for JMS 之外,是否有针对此问题的任何解决方法或最佳实践?
错误通道用于捕获网关下游流中的异常,回复的发送目前不在错误通道处理范围内。
去年我们将范围扩展到包括消息发送到下游流之前的消息转换,但回复处理仍然在该范围之外。
我们可以考虑添加它,但现在,唯一的 work-around 是使用有毒消息。或者,如果您知道哪个 replyTo queues 在您的应用程序中有效,您可以检查 jms_replyTo
header 并从流程中抛出异常。
鉴于我在 IBM WebSphere AS 8.5.5.9 中有应用程序 运行,通过 JMS(通过 JNDI 解析)连接到 IBM WebSphere MQ 7.0,使用 spring-integraion-jms(4.2.5) inbound-gateway配置如下:
<int-jms:inbound-gateway id="requestGateway"
connection-factory="jndiConnectionFactory"
request-destination="jndiQueueInput"
request-channel="channel.request.message"
reply-channel="channel.response.message"
default-reply-destination="jndiQueueOutput"
error-channel="errorChannel"/>
入站消息已处理,状态回复消息到达通道 channel.response.message
。
当入站消息在异常引发后有不正确的 jms_replyTo
header(即 non-existent queue)时,忽略 error-channel 设置(正确处理集成流程期间的任何其他异常):
WARN o.s.j.l.DefaultMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
com.ibm.msg.client.jms.DetailedInvalidDestinationException: JMSWMQ2008: Failed to open MQ queue 'BLABLABLA'.
at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:498)
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:216)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.checkJmqiCallSuccess(WMQMessageProducer.java:1086)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.checkJmqiCallSuccess(WMQMessageProducer.java:1044)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.access0(WMQMessageProducer.java:71)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer$SpiIdentifiedProducerShadow.initialise(WMQMessageProducer.java:790)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.<init>(WMQMessageProducer.java:1020)
at com.ibm.msg.client.wmq.internal.WMQSession.createProducer(WMQSession.java:926)
at com.ibm.msg.client.jms.internal.JmsSessionImpl.createProducer(JmsSessionImpl.java:1323)
at com.ibm.mq.jms.MQSession.createProducer(MQSession.java:682)
at com.ibm.ejs.jms.JMSMessageProducerHandle.<init>(JMSMessageProducerHandle.java:134)
at com.ibm.ejs.jms.JMSSessionHandle.createProducer(JMSSessionHandle.java:1869)
at org.springframework.integration.jms.ChannelPublishingJmsMessageListener.sendReply(ChannelPublishingJmsMessageListener.java:464)
at org.springframework.integration.jms.ChannelPublishingJmsMessageListener.onMessage(ChannelPublishingJmsMessageListener.java:358)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:721)
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:681)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:651)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:315)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:253)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1158)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1150)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1047)
at java.lang.Thread.run(Thread.java:785)
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2085' ('MQRC_UNKNOWN_OBJECT_NAME').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:204)
... 21 common frames omitted
然后消息被回滚并重新传送,从而形成无限循环。 除了 Handling poison messages in WebSphere MQ classes for JMS 之外,是否有针对此问题的任何解决方法或最佳实践?
错误通道用于捕获网关下游流中的异常,回复的发送目前不在错误通道处理范围内。
去年我们将范围扩展到包括消息发送到下游流之前的消息转换,但回复处理仍然在该范围之外。
我们可以考虑添加它,但现在,唯一的 work-around 是使用有毒消息。或者,如果您知道哪个 replyTo queues 在您的应用程序中有效,您可以检查 jms_replyTo
header 并从流程中抛出异常。