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