サービスアクティベーターと .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<?> 引数も参照してください。