最新动态
对于已经熟悉 Spring Integration 的用户,本章将简要概述 7.0 版本的新特性。
如果您对早期版本中引入的变更和功能感兴趣,请参阅变更历史。
Spring Integration 7.0 的新特性
更多详情,请参阅作为 7.0 开发流程一部分已解决的 GitHub Issues。
总的来说,项目已迁移至最新的依赖版本。Java 17 仍是基准线,但同时也支持 Java 24。
通用变更
基于 Junit 4 的支持组件已弃用。
spring-retry 依赖及其所有 API 用法已被 Spring Framework 核心模块中的重试 API 替代。这一重大变更是整个 Spring 技术栈自然演进的结果。总体而言,以下引用已完成迁移:
-
org.springframework.retry.support.RetryTemplate→org.springframework.core.retry.RetryTemplate; -
org.springframework.retry.RetryPolicy→org.springframework.core.retry.RetryPolicy; -
org.springframework.retry.RecoveryCallback→org.springframework.integration.core.RecoveryCallback。Spring Framework 中没有RecoveryCallback抽象,因为对RetryException使用常规的try..catch就足够了。对于 Spring Integration 来说,RecoveryCallback作为向错误通道发送死信消息的发布者是有意义的; -
org.springframework.retry.backoff.BackOffPolicy→org.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,以更准确地反映该属性的逻辑本质,即调用失败处理程序的实际尝试次数。
更多信息请参见重试建议。
现在所有模块都遵循标准的包结构。入站和出站组件分别在 inbound 和 outbound 包中声明,MessageChannel 的实现位于 channel 包中。大多数模块从一开始就遵循了这一规则。本版本中对包结构的重构涵盖了其余模块:spring-integration-file、spring-integration-ftp、spring-integration-ip、spring-integration-jdbc、spring-integration-jms、spring-integration-jmx、spring-integration-mail、spring-integration-sftp、spring-integration-stream 和 spring-integration-ws。原先位于根包中的类现在已被标记为弃用。
新组件
新增了 DistributedLock 接口,提供了新方法 lock(Duration ttl) 和 tryLock(long time, TimeUnit unit, Duration ttl),用于获取具有自定义生存时间(TTL)的锁。更多信息请参阅分布式锁。
Jackson 2 支持已被弃用并计划移除。Jackson 3 现已成为默认版本,并引入了新组件:JacksonJsonObjectMapper、JacksonPropertyAccessor、JacksonIndexAccessor 和 JacksonMessagingUtils。更多信息请参阅其 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_MESSAGE 和 INT_CHANNEL_MESSAGE 表中使用 MESSAGE_CONTENT 作为相应列的名称。更多信息请参阅 JDBC 消息存储。
JdbcChannelMessageStore 现在支持 JSON 序列化作为 Java 序列化的替代方案。新的组件 JsonChannelMessageStorePreparedStatementSetter 和 JsonMessageRowMapper 支持以 JSON 格式存储消息。这需要修改数据库模式,使用基于文本的列类型(如 JSONB、JSON、TEXT 或 CLOB)替代二进制类型。更多信息请参阅 JDBC 通道消息存储 JSON 序列化。
Redis 变更
RedisLock 现已支持自定义锁状态数据的生存时间。更多信息请参阅 Redis 锁注册表。
Hazelcast 变更
spring-integation-hazelcast 模块中先前已弃用的类,例如 LeaderInitiator、HazelcastMembershipListener、HazelcastLocalInstanceRegistrar 和 HazelcastLockRegistry,现已被移除,原因是 Hazelcast 开源库不支持 CP-subsystem。
MQTT 变更
AbstractMqttMessageDrivenChannelAdapter 和 ClientManager 实现现在公开了一个 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支持。