|
对于最新稳定版本,请使用 Spring Integration 7.0.0! |
java.util.function接口支持
从5.1版本开始,Spring Integration直接支持以下接口java.util.function包。
所有消息端点(服务激活器、变换器、过滤器等)现在都可以引用功能(或消费者) 豆子。
消息注释可以像普通方式一样直接应用在这些豆子上消息处理器定义。
例如,如果你有这个功能豆子定义:
@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;
}
当函数返回数组时,收集(本质上,任何可迭代),流或反应堆通量,@Splitter可以使用这样的豆子来对结果内容进行迭代。
这java.util.function.Consumer接口可用于<int:出站通道适配器>或者,与@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);
}
};
}
另外,注意上面代码片段中的注释:如果你想处理整个信息,请在你的功能/消费者你不能用lambda定义。
由于 Java 类型擦除,我们无法确定apply()/accept()方法调用。
这java.util.function.Supplier接口可以简单地与@InboundChannelAdapter注释,或作为裁判在<int:入站通道适配器>:
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public Supplier<String> pojoSupplier() {
return () -> "foo";
}
对于Java DSL,我们只需在端点定义中使用函数豆的引用。
与此同时,一个实现提供商接口可作为常规使用消息源定义:
@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 函数框架结合使用时,这种函数支持非常有用,我们有一个函数目录,可以从集成流定义中引用其成员函数。