最新の安定バージョンについては、Spring Integration 6.5.3 を使用してください! |
メッセージアドバイスの処理
このセクションの概要で説明したように、リクエストハンドラーアドバイスチェーンのアドバイスオブジェクトは、ダウンストリームフロー(存在する場合)ではなく、現在のエンドポイントにのみ適用されます。応答を生成する 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() にのみ適用するため、これはデフォルトでは不可能です。