4.3 和 5.0 之间的变更
新组件
版本 5.0 添加了许多新的组件。
Java DSL
单独的 Spring Integration Java DSL 项目现已合并到核心 Spring Integration 项目中。通道适配器和网关的 IntegrationComponentSpec
实现已分发到它们各自的模块。有关 Java DSL 支持的更多信息,请参阅 Java DSL。另请参阅 4.3 到 5.0 迁移指南,以了解迁移到 Spring Integration 5.0 所需的步骤。
测试支持
我们创建了一个新的 Spring 集成测试框架,以帮助测试 Spring 集成应用程序。现在,通过在测试类上使用 @SpringIntegrationTest
注解和 MockIntegration
工厂,可以使您的 JUnit 测试集成流变得相对简单。
详见 测试支持 获取更多信息。
MongoDB 外向网关
新的 MongoDbOutboundGateway
让你可以通过向其请求通道发送消息来按需查询数据库。
更多信息请参见 MongoDB 外发网关。
WebFlux 网关和通道适配器
我们介绍了新的 WebFlux 支持模块,用于 Spring WebFlux Framework 网关和通道适配器。
更多信息请参见 WebFlux 支持。
内容类型转换
现在我们使用基于新 InvocableHandlerMethod
的基础设施来调用服务方法,我们可以执行从有效负载到目标方法参数的 contentType
转换。
有关更多信息,请参阅 Content Type Conversion。
ErrorMessagePublisher
和 ErrorMessageStrategy
我们添加了 ErrorMessagePublisher
和用于创建 ErrorMessage
实例的 ErrorMessageStrategy
。
更多信息请参见 错误处理。
JDBC 元数据存储
我们添加了 MetadataStore
实现的 JDBC 实现。当您需要确保元数据的事务边界时,这非常有用。
更多信息请参见 JDBC 元数据存储。
通用更改
Spring Integration 现在完全基于 Spring Framework 5.0
和 Project Reactor 3.1
。之前的 Project Reactor 版本不再受支持。
核心更改
@Poller
注解现在有了 errorChannel
属性,便于配置底层的 MessagePublishingErrorHandler
。更多信息请参见 注解支持。
所有请求回复端点(基于 AbstractReplyProducingMessageHandler
)现在可以启动事务,因此,可以使整个下游流程事务化。更多信息,请参见事务支持。
SmartLifecycleRoleController
现在提供了获取角色中端点状态的方法。更多信息请参见 端点角色。
默认情况下,现在使用 InvocableHandlerMethod
来调用 POJO 方法,但你可以配置它们使用 SpEL,就像以前一样。更多信息,请参见 POJO 方法调用。
当将 POJO 方法作为消息处理程序时,你现在可以使用 @Default
注解标记其中一个服务方法,为不匹配的条件提供回退机制。更多信息,请参阅配置服务激活器。
我们添加了一个简单的 PassThroughTransactionSynchronizationFactory
,以始终将轮询的消息存储在当前事务上下文中。该消息用作 MessagingException
的 failedMessage
属性,后者包装了在事务完成期间抛出的任何原始异常。更多信息,请参见事务同步。
基于聚合器表达式的 ReleaseStrategy
现在针对 MessageGroup
而不仅仅是 Message<?>
的集合来评估表达式。更多信息,请参阅聚合器和Spring表达式语言 (SpEL)。
现在你可以为 ObjectToMapTransformer
提供一个自定义的 JsonObjectMapper
。
更多信息请参见 聚合器和Spring表达式语言 (SpEL)。
@GlobalChannelInterceptor
注解和 <int:channel-interceptor>
现在支持组件名称匹配的负模式(通过前置 !
)。更多信息请参见 Global Channel Interceptor Configuration。
当候选者未能获取锁时,LockRegistryLeaderInitiator
现在会通过 DefaultLeaderEventPublisher
发出一个新的 OnFailedToAcquireMutexEvent
事件。更多信息请参见 Leadership Event Handling。
网关更改
当网关方法具有 void
返回类型并且提供了错误通道时,网关现在正确地设置了 errorChannel
头。以前,该头未被填充。这导致同步下游流(在调用线程上运行)将异常发送到配置的通道,但异步下游流上的异常会被发送到默认的 errorChannel
。
RequestReplyExchanger
接口现在有一个 throws MessagingException
子句,以满足提议的消息交换合同。
你现在可以使用 SpEL 表达式来指定请求和回复的超时时间。更多信息,请参阅 消息网关。
聚合器性能更改
默认情况下,聚合器现在使用 SimpleSequenceSizeReleaseStrategy
,这更加高效,特别是在处理大型组时。空组现在将在 empty-group-min-timeout
后被安排移除。更多信息,请参阅 Aggregator。
Splitter 更改
Splitter 组件现在可以处理和拆分 Java Stream
和 Reactive Streams Publisher
对象。如果输出通道是 ReactiveStreamsSubscribableChannel
,AbstractMessageSplitter
会为后续迭代构建一个 Flux
,而不是常规的 Iterator
,这与被拆分的对象无关。此外,AbstractMessageSplitter
提供了 protected obtainSizeIfPossible()
方法,以允许确定 Iterable
和 Iterator
对象的大小(如果可能的话)。更多信息请参阅 Splitter。
JMS 更改
以前,Spring Integration JMS XML 配置使用 connectionFactory
作为 JMS 连接工厂的默认 bean 名称,允许在组件定义中省略该属性。我们将其重命名为 jmsConnectionFactory
,这是 Spring Boot 用于自动配置 JMS 连接工厂 bean 的 bean 名称。
如果您的应用程序依赖于之前的行为,您可以将 connectionFactory
bean 重命名为 jmsConnectionFactory
,或专门配置您的组件以使用其当前名称的 bean。有关更多信息,请参阅 JMS 支持。
邮件更改
已解决一些与渲染 IMAP 邮件内容不一致的问题。有关更多信息,请参阅“邮件接收通道适配器”部分中的说明。
Feed 更新
而不是已弃用的 com.rometools.fetcher.FeedFetcher
,我们在 ROME 中为 FeedEntryMessageSource
引入了一个新的 Resource
属性。更多信息请参阅 Feed 适配器。
文件更改
我们引入了新的 FileHeaders.RELATIVE_PATH
消息头,用于在 FileReadingMessageSource
中表示相对路径。
尾部适配器现在支持 idleEventInterval
,在该时间段内文件中没有数据时发出事件。
FileWritingMessageHandler
的刷新谓词现在有一个额外的参数。
文件 outbound 通道适配器和网关 (FileWritingMessageHandler
) 现在支持 REPLACE_IF_MODIFIED
FileExistsMode
。
他们现在还支持为新写入的文件设置文件权限。
现在提供了一个新的 FileSystemMarkerFilePresentFileListFilter
。有关更多信息,请参阅处理不完整数据。
FileSplitter
现在提供了一个 firstLineAsHeader
选项,用于将内容的第一行作为标题携带在为剩余行发出的消息中。
更多信息请参见文件支持。
FTP 和 SFTP 更改
入站通道适配器现在有一个名为 max-fetch-size
的属性,用于限制在轮询期间获取的文件数量,当本地目录中当前没有文件时。默认情况下,它们还配置了 local-filter
中的 FileSystemPersistentAcceptOnceFileListFilter
。
你也可以通过设置新引入的 scanner
属性来为入站通道适配器提供自定义的 DirectoryScanner
实现。
你现在可以配置正则表达式和模式过滤器以始终通过目录。当你在 outbound gateways 中使用递归时,这可能会很有用。
默认情况下,所有传入的通道适配器(基于流和同步的)现在使用适当的 AbstractPersistentAcceptOnceFileListFilter
实现来防止远程文件的重复下载。
FTP 和 SFTP 外发网关现在在获取远程文件时支持 REPLACE_IF_MODIFIED
FileExistsMode
。
现在的 FTP 和 SFTP 流式传入通道适配器会在消息头中添加远程文件信息。
FTP 和 SFTP outbound 通道适配器(以及 outbound 网关的 PUT
命令)现在也支持将 InputStream
作为 payload
。
现在,入站通道适配器可以通过使用新引入的 RecursiveDirectoryScanner
在本地构建文件树。请参阅 FTP 入站通道适配器 部分中的 scanner
选项以进行注入。此外,您现在可以将这些适配器切换到 WatchService
。
我们添加了 NLST
命令到 AbstractRemoteFileOutboundGateway
以执行列出远程文件名的命令。
你现在可以为 FtpOutboundGateway
提供 workingDirExpression
,以更改 FTP 客户端当前请求消息的工作目录。
现在,RemoteFileTemplate
通过 invoke(OperationsCallback<F, T> action)
提供,在同一个线程绑定的 Session
范围内执行多个 RemoteFileOperations
调用。
我们添加了新的过滤器来检测不完整的远程文件。
FtpOutboundGateway
和 SftpOutboundGateway
现在支持一个选项,在使用 GET
或 MGET
命令成功传输后删除远程文件。
详见 FTP/FTPS 适配器 和 SFTP 适配器 获取更多信息。
集成属性
版本 4.3.2 添加了一个新的 spring.integration.readOnly.headers
全局属性,允许您自定义不应复制到新创建的 Message
的标头列表。有关详细信息,请参阅全局属性。
流变更
我们在 CharacterStreamReadingMessageSource
上添加了一个新选项,使其可用于“管道”标准输入(stdin),并在管道关闭时发布应用程序事件。更多信息请参见从流读取。
屏障变化
BarrierMessageHandler
现在支持一个丢弃通道,用于发送晚到的触发消息。更多信息,请参阅 线程屏障。
AMQP 更改
现在,当您使用 RabbitMQ 延迟消息交换插件时,AMQP 外发端点支持设置延迟表达式。
现在,入站端点支持 Spring AMQP DirectMessageListenerContainer
。
轮询的 AMQP 支持的通道现在会将轮询线程阻塞轮询器配置的 receiveTimeout
(默认:一秒钟)。
消息转换器添加到消息属性中的标头(如 contentType
)现在会在最终消息中使用。以前,出现在最终消息中的标头和消息属性取决于转换器类型。要覆盖转换器设置的标头,将 headersMappedLast
属性设置为 true
。更多信息,请参阅 AMQP 支持。
HTTP 更改
默认情况下,DefaultHttpHeaderMapper.userDefinedHeaderPrefix
属性现在是一个空字符串,而不是 X-
。更多信息请参见 HTTP 标头映射。
默认情况下,uriVariablesExpression
现在使用 SimpleEvaluationContext
(自 5.0.4 起)。
更多信息请参见 映射 URI 变量。
MQTT 变更
入站消息现在使用 RECEIVED_TOPIC
、RECEIVED_QOS
和 RECEIVED_RETAINED
标头进行映射,以避免在应用程序中继消息时意外传播到出站消息。
outbound 通道适配器现在支持为 topic、qos 和 retained 属性使用表达式。默认值保持不变。更多信息,请参见 MQTT 支持。
STOMP 更改
我们将 STOMP 模块改为使用基于 Project Reactor 3.1
和 reactor-netty
扩展的 ReactorNettyTcpStompClient
。我们根据 ReactorNettyTcpStompClient
的基础,将 Reactor2TcpStompSessionManager
重命名为 ReactorNettyTcpStompSessionManager
。更多信息请参见 STOMP 支持。
Web Services 变更
你现在可以使用外部配置的 WebServiceTemplate
实例来提供 WebServiceOutboundGateway
实例。
DefaultSoapHeaderMapper
现在可以将 javax.xml.transform.Source
用户定义的头映射到 SOAP 头元素。
简单的 WebService 入站和出站网关现在可以处理完整的 WebServiceMessage
作为 payload
,允许操作 MTOM 附件。
更多信息请参见 Web Services Support。
Redis 更改
现在 RedisStoreWritingMessageHandler
提供了额外基于 String
的 SpEL 表达式设置方法(为了便于使用 Java 配置)。您现在也可以在 RedisStoreWritingMessageHandler
上配置 zsetIncrementExpression
。此外,由于 Redis 命令 ZADD
上的 INCR
选项是可选的,因此此属性已从 true
更改为 false
。
你现在可以为 RedisInboundChannelAdapter
提供一个 Executor
来执行 Redis 监听器调用者。此外,接收到的消息现在包含一个 RedisHeaders.MESSAGE_SOURCE
头,用于指示消息的来源(主题或模式)。
更多信息请参见 Redis 支持。
TCP 更改
我们添加了一个新的 ThreadAffinityClientConnectionFactory
用于将 TCP 连接绑定到线程。
你现在可以配置 TCP 连接工厂以支持 PushbackInputStream
实例,让反序列化程序在“读取超前”后“取消读取”(推回)字节。
我们添加了一个 ByteArrayElasticRawDeserializer
,不使用 maxMessageSize
来根据需要控制和缓冲传入的数据。
有关更多信息,请参阅 TCP 和 UDP 支持。
JDBC 更改
现在,JdbcMessageChannelStore
提供了一个 ChannelMessageStorePreparedStatementSetter
的设置器,让您能够自定义存储中的消息插入。
ExpressionEvaluatingSqlParameterSourceFactory
现在提供了一个 sqlParameterTypes
的 setter,让你可以自定义参数的 SQL 类型。
更多信息请参见 JDBC 支持。
指标变化
Micrometer 应用程序监控现在已被支持(自 5.0.2 版本起)。更多信息请参见 Micrometer 集成。
在版本 5.0.3 中,对 Micrometer 的 Meters
进行了修改,使其更适合在维度系统中使用。在 5.0.4 中进一步进行了更改。如果您使用 Micrometer,我们建议最低使用 5.0.4 版本。
@EndpointId
注解
在版本 5.0.4 中引入,此注解在您使用 Java 配置时提供了对 bean 命名的控制。有关更多信息,请参阅 Endpoint Bean Names。