コンテキストホルダーのアドバイス
バージョン 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 値がクリアされます。詳細については、"セッションファクトリの委譲" を参照してください。