このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Integration 6.4.3 を使用してください! |
サービスアクティベーターと .handle()
メソッド
.handle()
EIP メソッドのゴールは、MessageHandler
実装または POJO 上のメソッドを呼び出すことです。別のオプションは、ラムダ式を使用して「アクティビティ」を定義することです。その結果、一般的な GenericHandler<P>
関数インターフェースを導入しました。handle
メソッドには、P payload
と MessageHeaders headers
(バージョン 5.1 以降)の 2 つの引数が必要です。それができたら、次のようにフローを定義できます。
@Bean
public IntegrationFlow myFlow() {
return IntegrationFlow.from("flow3Input")
.<Integer>handle((p, h) -> p * 2)
.get();
}
上記の例は、受け取った整数を 2 倍にします。
ただし、Spring Integration の主なゴールの 1 つは、メッセージペイロードからメッセージハンドラーのターゲット引数へのランタイム型変換を介した loose coupling
です。Java はラムダクラスのジェネリクス型解決をサポートしていないため、ほとんどの EIP メソッドと LambdaMessageProcessor
に追加の payloadType
引数を使用した回避策を導入しました。そうすることで、ハード変換作業を Spring の ConversionService
に委譲します。payloadType
は、提供された type
とリクエストされたメッセージを使用してメソッド引数をターゲットにします。次の例は、結果の IntegrationFlow
がどのようになるかを示しています。
@Bean
public IntegrationFlow integerFlow() {
return IntegrationFlow.from("input")
.<byte[], String>transform(p - > new String(p, "UTF-8"))
.handle(Integer.class, (p, h) -> p * 2)
.get();
}
ConversionService
内に BytesToIntegerConverter
を登録して、追加の .transform()
を削除することもできます。
@Bean
@IntegrationConverter
public BytesToIntegerConverter bytesToIntegerConverter() {
return new BytesToIntegerConverter();
}
@Bean
public IntegrationFlow integerFlow() {
return IntegrationFlow.from("input")
.handle(Integer.class, (p, h) -> p * 2)
.get();
}
ラムダと Message<?>
引数も参照してください。