服務啟用器和 .handle() 方法
.handle() EIP 方法的目標是呼叫任何 MessageHandler 實現或某個 POJO 上的任何方法。另一個選項是使用 Lambda 表示式定義“活動”。因此,我們引入了一個通用的 GenericHandler<P> 函式式介面。它的 handle 方法需要兩個引數:P payload 和 MessageHeaders 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();
}
另請參見 Lambdas 和 Message<?> 引數。