メッセージアドバイスの処理

このセクションの概要で説明したように、リクエストハンドラーアドバイスチェーンのアドバイスオブジェクトは、ダウンストリームフロー(存在する場合)ではなく、現在のエンドポイントにのみ適用されます。応答を生成する MessageHandler オブジェクト(AbstractReplyProducingMessageHandler を継承するオブジェクトなど)の場合、アドバイスは内部メソッド handleRequestMessage() (MessageHandler.handleMessage() から呼び出される)に適用されます。他のメッセージハンドラーの場合、アドバイスは MessageHandler.handleMessage() に適用されます。

メッセージハンドラーが AbstractReplyProducingMessageHandler であっても、アドバイスを handleMessage メソッドに適用しなければならない状況がいくつかあります。例: べき等レシーバーが null を返す場合があります。これにより、ハンドラーの replyRequired プロパティが true に設定されている場合に例外が発生します。もう 1 つの例は BoundRabbitChannelAdvice です — 厳密なメッセージ順序を参照してください。

バージョン 4.3.1 から、新しい HandleMessageAdvice インターフェースとその基本実装(AbstractHandleMessageAdvice)が導入されました。HandleMessageAdvice を実装する Advice オブジェクトは、ハンドラー型に関係なく、常に handleMessage() メソッドに適用されます。

HandleMessageAdvice 実装(べき等レシーバーなど)は、レスポンスを返すハンドラーに適用されると、adviceChain から分離され、MessageHandler.handleMessage() メソッドに適切に適用されることを理解することが重要です。

この関連付けが解除されているため、アドバイスチェーンの順序は尊重されません。

次の構成を検討してください。

<some-reply-producing-endpoint ... >
    <int:request-handler-advice-chain>
        <tx:advice ... />
        <ref bean="myHandleMessageAdvice" />
    </int:request-handler-advice-chain>
</some-reply-producing-endpoint>

上記の例では、<tx:advice> は AbstractReplyProducingMessageHandler.handleRequestMessage() に適用されます。ただし、myHandleMessageAdvice は MessageHandler.handleMessage() に適用されます。<tx:advice>に呼び出されます。順序を保持するには、標準の Spring AOP 構成アプローチに従って、エンドポイント id を .handler サフィックスとともに使用して、ターゲット MessageHandler Bean を取得する必要があります。その場合、ダウンストリームフロー全体がトランザクションスコープ内にあることに注意してください。

レスポンスを返さない MessageHandler の場合、アドバイスチェーンの順序は保持されます。

バージョン 5.3 以降、HandleMessageAdviceAdapter は、MessageHandler.handleMessage() メソッドに任意の MethodInterceptor を適用するために提供されているため、サブフロー全体に適用されます。例: RetryOperationsInterceptor は、あるエンドポイントから始まるサブフロー全体に適用できます。コンシューマーエンドポイントはアドバイスを AbstractReplyProducingMessageHandler.RequestHandler.handleRequestMessage() にのみ適用するため、これはデフォルトでは不可能です。