java.util.function 介面支援
從 5.1 版本開始,Spring Integration 直接支援 java.util.function 包中的介面。所有訊息端點(服務啟用器、轉換器、過濾器等)現在都可以引用 Function(或 Consumer)bean。訊息註解 可以直接應用於這些 bean,類似於常規的 MessageHandler 定義。例如,如果您有以下 Function bean 定義:
@Configuration
public class FunctionConfiguration {
@Bean
public Function<String, String> functionAsService() {
return String::toUpperCase;
}
}
您可以在 XML 配置檔案中將其用作簡單引用:
<service-activator input-channel="processorViaFunctionChannel" ref="functionAsService"/>
當我們使用訊息註解配置流時,程式碼非常直接:
@Bean
@Transformer(inputChannel = "functionServiceChannel")
public Function<String, String> functionAsService() {
return String::toUpperCase;
}
當函式返回陣列、Collection(本質上是任何 Iterable)、Stream 或 Reactor Flux 時,可以在此類 bean 上使用 @Splitter 來對結果內容進行迭代。
java.util.function.Consumer 介面可以用於 <int:outbound-channel-adapter>,或者與 @ServiceActivator 註解一起使用,以執行流的最後一步:
@Bean
@ServiceActivator(inputChannel = "messageConsumerServiceChannel")
public Consumer<Message<?>> messageConsumerAsService() {
// Has to be an anonymous class for proper type inference
return new Consumer<Message<?>>() {
@Override
public void accept(Message<?> e) {
collector().add(e);
}
};
}
另外,請注意上面程式碼片段中的註釋:如果您想在 Function/Consumer 中處理整個訊息,則不能使用 lambda 定義。由於 Java 型別擦除,我們無法確定 apply()/accept() 方法呼叫的目標型別。
java.util.function.Supplier 介面可以簡單地與 @InboundChannelAdapter 註解一起使用,或者在 <int:inbound-channel-adapter> 中作為 ref 使用:
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public Supplier<String> pojoSupplier() {
return () -> "foo";
}
使用 Java DSL,我們只需在端點定義中使用對函式 bean 的引用。同時,Supplier 介面的實現可以用作常規的 MessageSource 定義:
@Bean
public Function<String, String> toUpperCaseFunction() {
return String::toUpperCase;
}
@Bean
public Supplier<String> stringSupplier() {
return () -> "foo";
}
@Bean
public IntegrationFlow supplierFlow() {
return IntegrationFlow.from(stringSupplier())
.transform(toUpperCaseFunction())
.channel("suppliedChannel")
.get();
}
此函式支援與 Spring Cloud Function 框架結合使用時非常有用,在該框架中,我們有一個函式目錄,可以從整合流定義中引用其成員函式。
此外,許多 Spring Integration 通道介面卡和模式都在 Spring Functions Catalog 專案中作為函式自動配置實現。