服務啟用器(Service Activators)與 .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 的一個主要目標是實現松耦合
,透過執行時型別轉換將訊息 payload 轉換為訊息處理器的目標引數。由於 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<?>
引數。