2016-05-19 11 views
0

spring-integraion-jms(4.2)を使用してJMS(JNDIで解決)経由でIBM WebSphere MQ 7.0に接続されたIBM WebSphere AS 8.5.5.9 0.5)として構成インバウンドゲートウェイは、以下:replyToが存在しないキューに設定されている場合の無限JMSメッセージ再配信ループ

<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に到着しました。

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.access$800(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 

が続いてメッセージがロールバック、および再配信ました: インバウンドメッセージが(つまり、存在しないキュー)次の例外がエラーチャンネル設定(正しく処理統合の流れの間に、他の例外)を無視して、提起間違ったjms_replyToヘッダを持っています無限ループになります。 この問題の回避策またはベストプラクティスはHandling poison messages in WebSphere MQ classes for JMS以外にありますか?

答えて

0

エラーチャネルは、ゲートウェイからのダウンストリームフローの例外をキャッチするためのものです。応答の送信は、現在、エラーチャネル処理の対象外です。

昨年、メッセージをダウンストリームフローに送信する前にメッセージ変換を含めるようにスコープを拡張しましたが、応答処理はまだそのスコープ外です。

これを追加することもできますが、唯一の回避策は毒メッセージの使用です。また、アプリケーションで有効なreplyToキューがわかっている場合は、jms_replyToヘッダーをチェックして、フローから例外をスローすることができます。

関連する問題