Spring Integration 5.1 正式发布!

发布 | Artem Bilan | 2018年10月29日 | ...

我代表 Spring Integration 团队高兴地宣布 Spring Integration 的5.1.0.RELEASE版本现已可用。

它可以从 Maven Central、JCenter 和我们的发布仓库下载。

compile "org.springframework.integration:spring-integration-core:5.1.0.RELEASE"

首先,我要感谢所有社区成员对框架持续的积极贡献!

除了常规的依赖项升级、错误修复和内部性能改进之外,此版本还引入了一些值得注意的新功能:

BoundRabbitChannelAdvice

为了严格的消息发布顺序,可以使用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();
}

响应式轮询

如果SourcePollingChannelAdapterPollingConsumer配置了outputChannelFluxMessageChannel,则轮询任务不是由调度器执行,而是作为Flux.generate(),随后基于trigger.nextExecutionTime()使用Mono.delay()。这样,实际的源轮询按需执行,遵守由FluxMessageChannel传播的下游反压。PollerMetadata选项保持不变,对最终配置透明。

Java DSL 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 函数改进

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

随着 Micrometer 1.1 的升级,框架现在会自动从MeterRegistry中移除已注册的度量。当我们开发动态IntegrationFlow并在运行时注册和移除它们时,这将非常方便。

JMX MBeans移除

现在,在运行时注册的 MBeans(例如,通过动态IntegrationFlow)会在它们的 bean 在运行时销毁时自动从 JMX 服务器注册中移除。

HTTP动态映射

在运行时声明的 HTTP(和 WebFlux)入站端点(例如,通过动态IntegrationFlow)现在会在HandlerMapping中注册它们的请求映射,并在它们的 bean 销毁时自动将其移除。

Spring Social Twitter 支持

由于 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版本,以开始开发新功能和有价值的改进!

欢迎通过适当的沟通渠道提供任何反馈、功能创意、批评、错误报告和问题。

项目页面 | JIRA | 贡献 | 帮助 | 聊天

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部