对于最新的稳定版本,请使用 Spring Integration 6.4.0! |
java.util.function
接口支持
从版本 5.1 开始, Spring 集成为包中的接口提供直接支持。
所有消息传递端点(Service Activator、Transformer、Filter 等)现在都可以引用(或)bean。
与常规定义类似,Messaging Annotations 可以直接应用于这些 bean。
例如,如果你有这个 bean 定义:java.util.function
Function
Consumer
MessageHandler
Function
@Configuration
public class FunctionConfiguration {
@Bean
public Function<String, String> functionAsService() {
return String::toUpperCase;
}
}
您可以将其用作 XML 配置文件中的简单引用:
<service-activator input-channel="processorViaFunctionChannel" ref="functionAsService"/>
当我们使用 Messaging Annotations 配置流时,代码很简单:
@Bean
@Transformer(inputChannel = "functionServiceChannel")
public Function<String, String> functionAsService() {
return String::toUpperCase;
}
当函数返回数组(本质上是 any )或 Reactor 时,可以在这样的 bean 上使用它来对结果内容执行迭代。Collection
Iterable
Stream
Flux
@Splitter
该接口可用于 OR,与 Comments 一起执行流的最后一步: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);
}
};
}
另外,请注意上面代码片段中的注释:如果您想处理 / 中的整个消息,则不能使用 lambda 定义。
由于 Java 类型擦除,我们无法确定方法调用的目标类型。Function
Consumer
apply()/accept()
该接口可以简单地与 annotation 一起使用,也可以作为 :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 框架一起使用时非常有用,其中我们有一个函数目录,并且可以从集成流定义中引用其成员函数。