このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Integration 6.5.3 を使用してください! |
コンテキストホルダーのアドバイス
バージョン 6.1 以降、ContextHolderRequestHandlerAdvice が導入されました。このアドバイスは、リクエストメッセージから何らかの値を取得し、コンテキストホルダーに格納します。ターゲットである MessageHandler での実行が終了すると、その値はコンテキストからクリアされます。このアドバイスを理解する最も良い方法は、ThreadLocal に何らかの値を格納し、ターゲット呼び出しからその値にアクセスし、実行後に ThreadLocal をクリーンアップするというプログラミングフローに似ていると考えることです。ContextHolderRequestHandlerAdvice は、値プロバイダとして Function<Message<?>, Object>、コンテキスト設定コールバックとして Consumer<Object>、コンテキストクリーンアップフックとして Runnable というコンストラクター引数を必要とします。
以下は、ContextHolderRequestHandlerAdvice を o.s.i.file.remote.session.DelegatingSessionFactory と組み合わせて使用する方法のサンプルです。
@Bean
DelegatingSessionFactory<?> dsf(SessionFactory<?> one, SessionFactory<?> two) {
return new DelegatingSessionFactory<>(Map.of("one", one, "two", two), null);
}
@Bean
ContextHolderRequestHandlerAdvice contextHolderRequestHandlerAdvice(DelegatingSessionFactory<String> dsf) {
return new ContextHolderRequestHandlerAdvice(message -> message.getHeaders().get("FACTORY_KEY"),
dsf::setThreadKey, dsf::clearThreadKey);
}
@ServiceActivator(inputChannel = "in", adviceChain = "contextHolderRequestHandlerAdvice")
FtpOutboundGateway ftpOutboundGateway(DelegatingSessionFactory<?> sessionFactory) {
return new FtpOutboundGateway(sessionFactory, "ls", "payload");
} また、FACTORY_KEY ヘッダーを one または two に設定して、メッセージを in チャネルに送信するだけで十分です。ContextHolderRequestHandlerAdvice は、そのヘッダーの値を setThreadKey を介して DelegatingSessionFactory に設定します。次に、FtpOutboundGateway が ls コマンドを実行すると、ThreadLocal の値に従って、適切な委譲 SessionFactory が DelegatingSessionFactory から選択されます。FtpOutboundGateway から結果が生成されると、ContextHolderRequestHandlerAdvice からの clearThreadKey() 呼び出しに従って、DelegatingSessionFactory 内の ThreadLocal 値がクリアされます。詳細については、"セッションファクトリの委譲" を参照してください。