跳转至

spring-integration v7.0.0

为什么要使用 Spring Integration

想象一下这个场景:你的应用是一座繁忙的国际机场,而各种数据、消息和事件是来自世界各地的航班。起初,只有几条航线,你手动调度尚可应付。但随着业务爆炸式增长——订单来了、支付响了、物流动了、通知发了——你的机场瞬间被数百架不同公司、不同机型的飞机挤满,它们讲着不同的协议(HTTP、JMS、FTP、TCP),有着不同的目的地。你用一堆自定义的 if-else、临时消息队列和手工粘合代码勉强维持,但系统变得脆弱、笨重且难以维护,每一次新航线的开通(新需求)都像是一次危险的空中交通管制实验。

这就是现代企业应用集成的真实矛盾:业务需求要求你快速、灵活地连接一切,而技术复杂性却试图将你拖入混乱、耦合的泥潭

Spring Integration 就是你一直在寻找的“空中交通控制系统”。它不生产“飞机”(业务逻辑),但为所有“飞机”的起降、滑行、中转提供了标准化、可预测且高可靠的通道。它优雅地解决了核心矛盾:通过一套声明式的、基于模式的企业集成范式,将你的注意力从“如何连接”的繁琐细节中解放出来,让你能重新专注于“连接什么”的业务价值。使用它,意味着选择秩序而非混沌,选择可维护的弹性而非脆弱的“能跑就行”。

Spring Integration 是什么

简单来说,Spring Integration 是 Spring 家族中的“连接器”与“路由器”。它扩展了 Spring 编程模型,为构建基于消息驱动的企业集成解决方案提供了一套强大的抽象。

其核心思想是**通过消息管道(Message Channel)将应用程序的不同组件连接起来**,让这些组件无需彼此直接调用,只需向管道发送或接收消息即可通信。它提供了大量的适配器(Adapter)来连接外部系统(如 HTTP、JMS、文件、数据库),以及丰富的处理器(Filter、Transformer、Router、Splitter 等)来在管道中对消息进行加工和路由。

你可以把它理解为企业内部的“神经系统”或“装配线”,它负责在复杂的系统环境中可靠地传输、转换和派发信息,让整个架构松耦合且易于扩展。

入门示例

真实场景:一个电商系统需要处理用户上传的订单批量文件(CSV格式)。流程是:监控指定目录 -> 读取新文件 -> 解析验证内容 -> 将有效订单数据存入数据库 -> 发送处理成功通知邮件。

开发示例(基于 Java DSL 配置):

import org.springframework.context.annotation.*;
import org.springframework.integration.config.*;
import org.springframework.integration.dsl.*;
import org.springframework.integration.file.dsl.*;
import java.io.File;

@Configuration
@EnableIntegration
public class FileProcessingIntegrationConfig {

    @Bean
    public IntegrationFlow fileProcessingFlow() {
        return IntegrationFlows
                // 1. 监控 /tmp/input 目录,每2秒轮询一次新文件
                .from(Files.inboundAdapter(new File("/tmp/input"))
                                .patternFilter("*.csv"),
                      e -> e.poller(Pollers.fixedDelay(2000)))
                // 2. 将文件内容转换为字符串
                .transform(Files.toStringTransformer())
                // 3. 将CSV字符串转换为订单对象列表(自定义转换器)
                .transform(csvToOrderListTransformer())
                // 4. 拆分列表,让每个订单作为独立消息继续处理
                .split()
                // 5. 过滤掉无效订单(自定义过滤器)
                .filter(Order.class, Order::isValid)
                // 6. 将订单数据存入数据库(自定义服务激活器)
                .handle(orderService, "saveOrder")
                // 7. 处理成功后,准备邮件通知内容
                .transform(order -> "订单 " + ((Order) order).getId() + " 已成功处理。")
                // 8. 发送邮件(此处简化,实际需配置邮件适配器)
                .handle(mailService, "sendNotification")
                .get();
    }

    // 此处省略了 csvToOrderListTransformer, orderService, mailService 等Bean的定义
}

这个流程清晰定义了数据从文件到最终通知的“旅程”,每个步骤职责单一,通过 Spring Integration 的管道连接,易于测试、修改和监控。

Spring Integration v7.0.0 版本更新了什么

Spring Integration 7.0.0 是一个重要的主版本更新。其主要变化包括:全面转向 Spring Framework 6.3 和 Java 21 基线,为现代 Java 开发铺平道路。它引入了对 Jakarta EE 10 的全面支持,并移除了长期废弃的 API 和组件,使代码库更精简。性能方面,它优化了消息传递核心并提供了对 Project Reactor 的更深入集成。此外,该版本升级了众多关键依赖(如 Reactor、AMQP、Kafka 客户端),并继续增强其 Kotlin DSL,为开发者提供了更现代化、更高效的集成开发体验。

更新日志

⭐ 新功能

  • 调整:对齐 SQL Server DDL 列类型,以降低潜在的隐式转换风险 #10586
  • 尽可能优化 new ArrayList() 的分配 #10573

🐞 错误修复

  • 修复 CompositeExecutor 构造函数中不正确的空检查 #10575
  • 修复 Redis[Clustered] 在解锁时出现 “CROSSSLOT Keys in request” 错误的问题 #10546
  • 修复用于自动创建输入目录的 Files DSL #10525

📔 文档

  • 通过 DSL 示例扩展邮件相关文档 #10572

🔨 依赖升级

  • 将 org.springframework.ws:spring-ws-bom 从 5.0.0-SNAPSHOT 升级至 5.0.0 #10597
  • 将 protobufVersion 从 4.33.0 升级至 4.33.1 #10577
  • 将 tools.jackson:jackson-bom 从 3.0.1 升级至 3.0.2 #10562
  • 将 tools.jackson:jackson-bom 从 3.0.0 升级至 3.0.1 #10527
  • 将 graalvmVersion 从 25.0.0 升级至 25.0.1 #10526

总结

总而言之,这是一次典型的维护性更新,侧重于**修复已知缺陷、优化内部细节、完善使用文档并保持依赖版本的最新