java.util.function
接口支持
从 5.1 版本开始,Spring Integration 直接支持 java.util.function
包中的接口。现在,所有消息传递端点(服务激活器、转换器、过滤器等)都可以引用 Function
(或 Consumer
)bean。与常规 MessageHandler
定义类似,可以将消息传递注解直接应用于这些 bean。例如,如果您有以下 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框架一起使用时非常有用,在该框架中,我们有一个函数目录,并且可以从集成流定义中引用其成员函数。