6

私は、RabbitMQSpring Integrationを使用して、着信 JSON メッセージを処理しています。

構成の関連部分は次のようになります。

<amqp:inbound-channel-adapter channel="incomingChannel" queue-names="..."
      message-converter="jsonConverter" error-handler="errorHandler"
      error-channel="errorChannel" />

JSON コンバーターとして Jackson Databind を使用しています。

受信 JSON メッセージの構文が正しくない場合があります。これにより、次の (正しい) 例外が発生します。

org.springframework.amqp.rabbit.listener.ListenerExecutionFailedException: Listener threw exception
Caused by: org.springframework.amqp.support.converter.MessageConversionException: Failed to convert Message content
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token...

例外は、errorHandler単にMessagePublishingErrorHandlertoである によって処理されerrorChannelます。

ここまでは順調ですね。問題は、メッセージをエラー ハンドラで処理しているにもかかわらず、メッセージがまだ AMQP クライアントによって拒否されていることです。その後、RabbitMQ はメッセージを何度も再配信します。配信不能キューを構成しても役に立ちませんでした。このシナリオを正しく処理する方法はありますか?

(逆シリアル化が成功した後の) 処理のさらに下にある例外は問題なく処理されます。AMQP メッセージが確認され、エラー メッセージが に送信されerrorChannelます。

何か案は?

ライブラリのバージョン:

  • 春の統合: 3.0.1
  • 春のフレームワーク: 4.0.2
  • ジャクソン データバインド: 2.3.1
4

1 に答える 1

6

defaultRequeueRejected=falseリスナーコンテナに設定できます。

属性は現在、チャネル アダプターで公開されていませんが、コンテナーを として定義し、属性<bean... class="...SimpleMessageListenerContainer"/>を使用してアダプターに挿入することができます。listener-container

ErrorHandlerまたは、をスローするカスタムを使用しますAmqpRejectAndDontRequeueException

于 2014-02-26T16:15:34.710 に答える