领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多我代表 Spring Integration 团队高兴地宣布 Spring Integration 的5.1.0.RELEASE
版本现已可用。
它可以从 Maven Central、JCenter 和我们的发布仓库下载。
compile "org.springframework.integration:spring-integration-core:5.1.0.RELEASE"
首先,我要感谢所有社区成员对框架持续的积极贡献!
除了常规的依赖项升级、错误修复和内部性能改进之外,此版本还引入了一些值得注意的新功能:
为了严格的消息发布顺序,可以使用BoundRabbitChannelAdvice
作为MessageHandler
的advice,以便在同一个线程绑定的Channel
中执行所有下游AMQP操作。通常与splitter或其他可能导致发送多个消息的机制一起使用。
@Bean
public IntegrationFlow flow(RabbitTemplate template) {
return IntegrationFlows.from(Gateway.class)
.split(s -> s.delimiters(",")
.advice(new BoundRabbitChannelAdvice(template))
.<String, String>transform(String::toUpperCase)
.handle(Amqp.outboundAdapter(template).routingKey("rk"))
.get();
}
如果SourcePollingChannelAdapter
或PollingConsumer
配置了outputChannel
为FluxMessageChannel
,则轮询任务不是由调度器执行,而是作为Flux.generate()
,随后基于trigger.nextExecutionTime()
使用Mono.delay()
。这样,实际的源轮询按需执行,遵守由FluxMessageChannel
传播的下游反压。PollerMetadata
选项保持不变,对最终配置透明。
fluxTransform()
IntegrationFlowDefinition
现在提供了一个新的fluxTransform()
操作符,它接受一个Function
,用于通过响应式方式转换传入消息的Flux
。在底层,fluxTransform()
完全基于Reactor的Flux.transform()
操作符,如果函数没有已经生成回复消息,则会将请求头复制到回复消息中。调用在内部用输入和输出FluxMessageChannel
实例包装。
IntegrationFlow integrationFlow = f -> f
.split()
.<String, String>fluxTransform(flux -> flux
.map(Message::getPayload)
.map(String::toUpperCase))
.aggregate(a -> a
.outputProcessor(group -> group
.getMessages()
.stream()
.map(Message::getPayload)
.map(String.class::cast)
.collect(Collectors.joining(","))))
.channel(resultChannel);
此外,Java DSL还提供了更多方便的操作符:nullChannel()
、convert(Class<?>)
和logAndReply()
。请参阅它们的Javadoc了解更多信息。
java.util.function
接口现在作为消息传递端点的首要公民。例如,可以直接从@ServiceActivator
或@Transformer
定义中使用Function<?, ?>
和Consumer<?>
。
@Bean
@Transformer(inputChannel = "functionServiceChannel")
public Function<String, String> functionAsService() {
return String::toUpperCase;
}
Supplier<?>
接口可以简单地与@InboundChannelAdapter
注解一起使用,或者在<int:inbound-channel-adapter>
中作为ref
使用。
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public Supplier<String> pojoSupplier() {
return () -> "foo";
}
现在也可以直接在消息传递端点定义中使用 Kotlin lambda 表达式。
@Bean
@Transformer(inputChannel = "functionServiceChannel")
fun kotlinFunction(): (String) -> String {
return { it.toUpperCase() }
}
@Bean
@ServiceActivator(inputChannel = "messageConsumerServiceChannel")
fun kotlinConsumer(): (Message<Any>) -> Unit {
return { print(it) }
}
@Bean
@InboundChannelAdapter(value = "counterChannel",
poller = [Poller(fixedRate = "10", maxMessagesPerPoll = "1")])
fun kotlinSupplier(): () -> String {
return { "baz" }
}
随着 Micrometer 1.1
的升级,框架现在会自动从MeterRegistry
中移除已注册的度量。当我们开发动态IntegrationFlow
并在运行时注册和移除它们时,这将非常方便。
现在,在运行时注册的 MBeans(例如,通过动态IntegrationFlow
)会在它们的 bean 在运行时销毁时自动从 JMX 服务器注册中移除。
在运行时声明的 HTTP(和 WebFlux)入站端点(例如,通过动态IntegrationFlow
)现在会在HandlerMapping
中注册它们的请求映射,并在它们的 bean 销毁时自动将其移除。
由于 Spring Social 项目即将结束生命周期,我们已将spring-integration-twitter
模块移至Spring Integration Extensions下的独立项目,并发布了org.springframework.integration:spring-integration-social-twitter:1.0.0.RELEASE
,它完全基于 Spring Integration 5.1
。
有关更多更改,请查看参考手册的新增功能章节。另请参阅迁移指南,了解此版本中的重大更改以及如何应对这些更改。
此版本是 Spring Boot 2.1 GA
的基础。
从这里开始,我们期待将master
分支切换到5.2
版本,以开始开发新功能和有价值的改进!
欢迎通过适当的沟通渠道提供任何反馈、功能创意、批评、错误报告和问题。