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 框架一起使用時,此函數支援非常有用,在該框架中,我們有一個函數目錄,並且可以從整合流程定義中參考其成員函數。