java.util.function
インターフェースのサポート
バージョン 5.1 から、Spring Integration は java.util.function
パッケージのインターフェースを直接サポートします。すべてのメッセージングエンドポイント(Service Activator、Transformer、Filter など)が Function
(または Consumer
)Bean を参照できるようになりました。メッセージングアノテーションは、通常の MessageHandler
定義と同様に、これらの Bean に直接適用できます。たとえば、この Function
Bean 定義がある場合:
@Configuration
public class FunctionConfiguration {
@Bean
public Function<String, String> functionAsService() {
return String::toUpperCase;
}
}
XML 構成ファイルの単純な参照として使用できます。
<service-activator input-channel="processorViaFunctionChannel" ref="functionAsService"/>
メッセージングアノテーションを使用してフローを構成する場合、コードは簡単です。
@Bean
@Transformer(inputChannel = "functionServiceChannel")
public Function<String, String> functionAsService() {
return String::toUpperCase;
}
関数が配列を返す場合、Collection
(基本的には任意の Iterable
)、Stream
または Reactor Flux
、@Splitter
をそのような Bean で使用して、結果コンテンツの反復を実行できます。
java.util.function.Consumer
インターフェースは、<int:outbound-channel-adapter>
に使用したり、@ServiceActivator
アノテーションと一緒に使用して、フローの最終ステップを実行したりできます。
@Bean
@ServiceActivator(inputChannel = "messageConsumerServiceChannel")
public Consumer<Message<?>> messageConsumerAsService() {
// Has to be an anonymous class for proper type inference
return new Consumer<Message<?>>() {
@Override
public void accept(Message<?> e) {
collector().add(e);
}
};
}
また、上記のコードスニペットのコメントにも注意してください。Function
/Consumer
でメッセージ全体を処理する場合は、ラムダ定義を使用できません。Java 型消去のため、apply()/accept()
メソッド呼び出しのターゲット型を判別できません。
java.util.function.Supplier
インターフェースは、@InboundChannelAdapter
アノテーションと一緒に、または <int:inbound-channel-adapter>
の ref
として単純に使用できます。
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public Supplier<String> pojoSupplier() {
return () -> "foo";
}
Java DSL では、エンドポイント定義で関数 Bean への参照を使用するだけです。一方、Supplier
インターフェースの実装は、通常の MessageSource
定義として使用できます。
@Bean
public Function<String, String> toUpperCaseFunction() {
return String::toUpperCase;
}
@Bean
public Supplier<String> stringSupplier() {
return () -> "foo";
}
@Bean
public IntegrationFlow supplierFlow() {
return IntegrationFlow.from(stringSupplier())
.transform(toUpperCaseFunction())
.channel("suppliedChannel")
.get();
}
この関数サポートは、Spring Cloud Function (英語) フレームワークと一緒に使用すると便利です。Spring Cloud Function (英語) フレームワークでは、関数カタログがあり、そのメンバー関数を統合フロー定義から参照できます。
また、多くの Spring Integration チャネルアダプターとパターンは、Spring 機能カタログ [GitHub] (英語) プロジェクトで関数の自動構成として実装されています。