跳到主要内容
版本:7.0.2

最新动态

DeepSeek V3 中英对照 What’s New?

对于已经熟悉 Spring Integration 的用户,本章将简要概述 7.0 版本的新特性。

如果您对早期版本中引入的变更和功能感兴趣,请参阅变更历史

Spring Integration 7.0 的新特性

更多详情,请参阅作为 7.0 开发流程一部分已解决的 GitHub Issues

总的来说,项目已迁移至最新的依赖版本。Java 17 仍是基准线,但同时也支持 Java 24。

通用变更

基于 Junit 4 的支持组件已弃用。

该项目现在利用 JSpecify 注解来提供空安全 API,并通过 NullAway 作为构建的一部分来检查这些可空性声明的一致性。

spring-retry 依赖及其所有 API 用法已被 Spring Framework 核心模块中的重试 API 替代。这一重大变更是整个 Spring 技术栈自然演进的结果。总体而言,以下引用已完成迁移:

  • org.springframework.retry.support.RetryTemplateorg.springframework.core.retry.RetryTemplate;

  • org.springframework.retry.RetryPolicyorg.springframework.core.retry.RetryPolicy;

  • org.springframework.retry.RecoveryCallbackorg.springframework.integration.core.RecoveryCallback。Spring Framework 中没有 RecoveryCallback 抽象,因为对 RetryException 使用常规的 try..catch 就足够了。对于 Spring Integration 来说,RecoveryCallback 作为向错误通道发送死信消息的发布者是有意义的;

  • org.springframework.retry.backoff.BackOffPolicyorg.springframework.util.backoff.BackOff。然而,它并不直接作为 RetryTemplate 的选项公开:而是通过 RetryPolicy.Builder 配置支持的内部 API;

  • AMQP、JMS 和 Apache Kafka 通道适配器中的 RetryContext 已被内部的 AttributeAccessor 实现所取代。

因此,以下项目类别发生了破坏性变更:

  • AmqpBaseInboundChannelAdapterSpec

  • AmqpBaseInboundGatewaySpec

  • AmqpInboundChannelAdapter

  • AmqpInboundGateway

  • PostgresSubscribableChannel

  • ChannelPublishingJmsMessageListener

  • JmsInboundGatewaySpec

  • JmsMessageDrivenChannelAdapterSpec

  • KafkaInboundGatewaySpec

  • KafkaMessageDrivenChannelAdapterSpec

  • KafkaInboundEndpoint

  • KafkaInboundGateway

  • KafkaMessageDrivenChannelAdapter

RequestHandlerRetryAdvice 已重构,以尽可能避免依赖外部 API。对于无状态重试逻辑,仅需提供 org.springframework.core.retry.RetryPolicy 即可。有状态重试逻辑通过 Function<Message<?>, Object> stateKeyFunction 激活。由于依赖 spring-retry API,RetryStateGenerator 抽象及其 SpelExpressionRetryStateGenerator 实现已被移除。

<int:handler-retry-advice> XML 组件的 max-attempts 属性已重命名为 max-retries,以更准确地反映该属性的逻辑本质,即调用失败处理程序的实际尝试次数。

更多信息请参见重试建议

现在所有模块都遵循标准的包结构。入站和出站组件分别在 inboundoutbound 包中声明,MessageChannel 的实现位于 channel 包中。大多数模块从一开始就遵循了这一规则。本版本中对包结构的重构涵盖了其余模块:spring-integration-filespring-integration-ftpspring-integration-ipspring-integration-jdbcspring-integration-jmsspring-integration-jmxspring-integration-mailspring-integration-sftpspring-integration-streamspring-integration-ws。原先位于根包中的类现在已被标记为弃用。

新组件

新增了 DistributedLock 接口,提供了新方法 lock(Duration ttl)tryLock(long time, TimeUnit unit, Duration ttl),用于获取具有自定义生存时间(TTL)的锁。更多信息请参阅分布式锁

Jackson 2 支持已被弃用并计划移除。Jackson 3 现已成为默认版本,并引入了新组件:JacksonJsonObjectMapperJacksonPropertyAccessorJacksonIndexAccessorJacksonMessagingUtils。更多信息请参阅其 Javadocs,迁移路径请参考已弃用的类。

spring-integration-amqp 模块现已实现对 RabbitMQ AMQP 1.0 支持的通道适配器。关于详细信息,请参阅专门的 AMQP 1.0 支持章节。

JDBC 变更

JDBC模块现在通过其专用的org.springframework.integration.jdbc.dsl.Jdbc工厂提供了Java DSL API。关于JDBC组件的Java DSL的更多细节,请参阅Java DSL for JDBC Components章节。

JdbcLock 现已支持自定义锁状态数据存活时间的功能。更多信息请参阅 JDBC 锁注册表

消息存储现在使用 MESSAGE_CONTENT 列名来存储序列化消息,而不是 MESSAGE_BYTES,因为内容可能并不总是以字节数组的形式存储。所有开箱即用的 SQL 模式也已更改,以在 INT_MESSAGEINT_CHANNEL_MESSAGE 表中使用 MESSAGE_CONTENT 作为相应列的名称。更多信息请参阅 JDBC 消息存储

JdbcChannelMessageStore 现在支持 JSON 序列化作为 Java 序列化的替代方案。新的组件 JsonChannelMessageStorePreparedStatementSetterJsonMessageRowMapper 支持以 JSON 格式存储消息。这需要修改数据库模式,使用基于文本的列类型(如 JSONBJSONTEXTCLOB)替代二进制类型。更多信息请参阅 JDBC 通道消息存储 JSON 序列化

Redis 变更

RedisLock 现已支持自定义锁状态数据的生存时间。更多信息请参阅 Redis 锁注册表

Hazelcast 变更

spring-integation-hazelcast 模块中先前已弃用的类,例如 LeaderInitiatorHazelcastMembershipListenerHazelcastLocalInstanceRegistrarHazelcastLockRegistry,现已被移除,原因是 Hazelcast 开源库不支持 CP-subsystem。

MQTT 变更

AbstractMqttMessageDrivenChannelAdapterClientManager 实现现在公开了一个 quiescentTimeout 选项,该选项在其 stop() 方法中向下传播到 MQTT Paho 客户端的 disconnectForcibly() API。更多信息请参阅 MQTT 支持

文件变更

FileReadingMessageSource 现在可以为其 directory 属性配置一个 SpEL Expression。更多信息请参阅读取文件

远程文件支持变更

AbstractInboundFileSynchronizer 现在会在按 maxFetchSize 切片后缓存 Session.list(remoteDirectory) 的筛选结果。因此,后续的同步操作仅通过 maxFetchSize 处理缓存,直到缓存耗尽。更多信息请参阅入站通道适配器:控制远程文件获取

所有 AbstractPersistentAcceptOnceFileListFilter 实现现在都使用"长文件名"作为元数据条目的键。以前,仅使用文件名可能导致元数据覆盖问题,当同一过滤器用于具有相同文件名的不同目录时。例如,RotatingServerAdvice 可能会根据时间戳切换到不同的目录,但根据业务逻辑,文件以相同的名称放置在那里。更多信息请参阅远程持久化文件列表过滤器

空安全

已将代码库更新为使用 JSpecify 和 NullAway,添加了全面的空安全实现,该实现使用 @NullMarked 注解在包级别将所有类型默认设为非空,并使用 @Nullable 注解显式标记可为空的类型。更多信息请参阅空安全

SMB 支持变更

SMB支持模块背后的JCIFS库已升级至3.0.0版本。这是代码库的重大重构,并实现了新的包结构。这是一项破坏性变更,直接引用JCIFS库组件的代码需要进行更新。更多信息请参阅 SMB支持