|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
java.util.function 接口支持
从 5.1 版本开始,Spring Integration 提供了对 java.util.function 包中接口的直接支持。
所有消息端点(Service Activator、Transformer、Filter 等)现在都可以引用 Function(或 Consumer)bean。
Messaging Annotations 可以直接应用于这些 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、@Splitter 可用于此类 Bean 以对结果内容执行迭代。
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 注解一起使用,或者作为 ref 中的 <int:inbound-channel-adapter>:
@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 项目中作为函数自动配置实现。