服務啟動器與 .handle() 方法

.handle() EIP 方法的目標是調用任何 MessageHandler 實作或某些 POJO 上的任何方法。 另一種選擇是使用 Lambda 運算式定義「活動」。 因此,我們引入了通用的 GenericHandler<P> 函數介面。 其 handle 方法需要兩個引數:P payloadMessageHeaders headers(從 5.1 版開始)。 有了這個,我們可以將流程定義如下

@Bean
public IntegrationFlow myFlow() {
    return IntegrationFlow.from("flow3Input")
        .<Integer>handle((p, h) -> p * 2)
        .get();
}

前面的範例會將收到的任何整數加倍。

然而,Spring Integration 的主要目標之一是透過在執行時期將訊息酬載轉換為訊息處理器的目標引數類型,來實現鬆耦合。 由於 Java 不支援 Lambda 類別的泛型類型解析,因此我們針對大多數 EIP 方法和 LambdaMessageProcessor 引入了使用額外 payloadType 引數的變通方法。 這樣做會將繁重的轉換工作委派給 Spring 的 ConversionService,後者會使用提供的 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();
}