Changes between 5.0 and 5.1
-
新增组件和集成支持,包括 java.util.function 接口、@LongRunningTest 注释和 AmqpDedicatedChannelAdvice。
-
针对调度程序异常、全局通道拦截器、ObjectToJsonTransformer 和集成流组件的 bean 名称进行了改进。
-
聚合器、文件支持、AMQP、JDBC、FTP、SFTP、TCP、Twitter、JMS、HTTP/WebFlux、JMX 和微表计支持方面进行了更改和增强。
-
集成图可以自定义,新的全局属性可以记录,并且 @Poller 注释具有一个接收超时选项。
New Components
General Changes
在 5.1 版本中进行了以下更改:
Java DSL
IntegrationFlowContext
现在是一个接口,IntegrationFlowRegistration
是 IntegrationFlowContext
的内部接口。
引入了新的 logAndReply()
运算符,以便在流的末尾针对请求-应答配置进行日志记录。这避免了与 log()
的混淆,log()
被视为单向末端流组件。
针对集成流程中任何 NamedComponent
生成的 bean 名称现在基于组件类型,以便从视觉工具、日志分析器和指标收集器更好地读取。
GenericHandler.handle()
现在会将 MessageHeaders
类型用作第二个参数。
Dispatcher Exceptions
AbstractDispatcher
捕获并重新抛出的异常现在更一致:
-
具有
failedMessage
属性的任何类型的MessagingException
都将按原样重新抛出。 -
所有其他异常都将包装在
MessageDeliveryException
中,其中包含设置的failedMessage
属性。
以往:
-
具有
failedMessage
属性的任何类型的MessagingException
都将按原样重新抛出 -
未具有
failedMessage
属性的MessagingException
将包装在MessagingException
中,其中包含设置的failedMessage
属性。 -
其他
RuntimeException
实例未改变地重新抛出。 -
已检查的异常包装在一个
MessageDeliveryException
中,该MessageDeliveryException
具有设置的failedMessage
属性。
Global Channel Interceptors
全局通道拦截器现在适用于动态注册的通道,例如,在使用 Java DSL 或使用 beanFactory.initializeBean()
初始化的 bean 时通过 IntegrationFlowContext
进行动态注册。以往,当应用程序上下文刷新后创建的 bean,不会应用拦截器。
Channel Interceptors
当没有收到消息时,将不再调用 ChannelInterceptor.postReceive()
;不再需要检查 Message<?>
是否为 null
。以往会调用该方法。如果您有依赖于之前行为的拦截器,那么请实现 afterReceiveCompleted()
,因为该方法将被调用,无论是否收到消息。此外,PolledAmqpChannel
和 PolledJmsChannel
以前没有使用 null
调用 afterReceiveCompleted()
;现在会使用 null
进行调用。
ObjectToJsonTransformer
为 ObjectToJsonTransformer
引入了新的 ResultType.BYTES
模式。
有关详细信息,请参阅 JSON Transformers。
Integration Flows: Generated Bean Names
从版本 5.0.5 开始,集成流中组件的生成 bean 名称包括流 bean 名称,后跟一个句点,作为前缀。例如,如果流 bean 命名为 flowBean
,则生成的 bean 可能命名为 flowBean.generatedBean
。
有关更多信息,请参见 Working With Message Flows。
Aggregator Changes
如果 groupTimeout
被计算为负值,则汇聚器现在立即使组失效。仅将 null
视为一个信号,即对当前消息不采取任何操作。
已引入新的 popSequence
属性,以允许(默认情况下)为输出消息调用 MessageBuilder.popSequenceDetails()
。此外,为了进行优化,AbstractAggregatingMessageGroupProcessor
现在返回 AbstractIntegrationMessageBuilder
而不是整个 Message
。
有关详细信息,请参阅 Aggregator。
Files Changes
如果您正在使用 FileExistsMode.APPEND
或 FileExistsMode.APPEND_NO_FLUSH
,则可以提供一个 newFileCallback
,该回调在创建新文件时会调用。此回调会接收新创建的文件和触发回调的消息。例如,这可用于写入 CSV 标头。
FileReadingMessageSource
现在只有在调用其 start()
之后才检查和创建目录。因此,如果 FileReadingMessageSource
的入站通道适配器具有 autoStartup = false
,则在应用程序启动期间不会出现针对文件系统的故障。
有关更多信息,请参见 File Support。
AMQP Changes
我们已在 DefaultAmqpHeaderMapper
中对 ID
及 Timestamp
页眉映射进行了更改。有关更多信息,请参见 AMQP Message Headers 底部附近的注解。
contentType
标头现已正确映射为通用标头映射中的一个条目。有关更多信息,请参阅 contentType Header。
从版本 5.1.3 起,如果在使用手动确认时发生消息转换异常,且已定义错误通道,则有效负载是一个 ManualAckListenerExecutionFailedException
,它包含附加的 channel
和 deliveryTag
属性。这使得错误流对原始消息进行确认/否定。有关更多信息,请参见 Inbound Message Conversion。
JDBC Changes
JDBC 入站通道适配器和 JDBC 出站网关上的一个令人困惑的 max-rows-per-poll
属性已被弃用,转而使用新引入的 max-rows
属性。
当请求消息的有效负载是 Iterable
类型的实例时,JdbcMessageHandler
现在支持 batchUpdate
功能。
(JdbcChannelMessageStore)
的 INT_CHANNEL_MESSAGE
表的索引已得到优化。如果您在该存储中有较大的消息组,则可能希望更改索引。
有关更多信息,请参见 JDBC Support。
FTP and SFTP Changes
现在可以利用 RotatingServerAdvice
通过入站通道适配器轮询多个服务器和目录。有关更多信息,请参见 Inbound Channel Adapters: Polling Multiple Servers and Directories 和 Inbound Channel Adapters: Polling Multiple Servers and Directories。
此外,入站适配器 localFilenameExpression
实例可包含 #remoteDirectory
变量,其中包含所轮询的远程目录。用于对流媒体适配器的获取文件列表进行排序的比较器的泛型类型已从 Comparator<AbstractFileInfo<F>>
更改为 Comparator<F>
。有关更多信息,请参见 FTP Streaming Inbound Channel Adapter 和 SFTP Streaming Inbound Channel Adapter。
此外,现在可以使用 Comparator
为入站通道适配器的同步器提供支持。当使用 maxFetchSize
限制检索的文件时,这一点非常有用。
CachingSessionFactory
有一个新属性 testSession
,当该属性为 true 时,工厂将在从缓存中签出现有会话时对 Session
执行 test()
操作。
有关更多信息,请参见 SFTP Session Caching 和 FTP Session Caching。
出站网关 MPUT 命令现在支持带有文件或字符串集合的消息有效负载。有关更多信息,请参见 SFTP Outbound Gateway 和 FTP Outbound Gateway。
TCP Support
在使用 SSL 时,现在默认情况下启用主机验证,以防止对拥有受信任证书的人在中间进行攻击。有关更多信息,请参阅 Host Verification。
此外,现在可以在 DefaultTcpSSLContextSupport
上配置密钥和信任库类型。
Twitter Support
由于 Spring Social 项目已迁移到 end of life status,Twitter 在 Spring Integration 中的支持已迁移到 Extensions 项目。有关更多信息,请参阅 Spring Integration Social Twitter。
JMS Support
JmsSendingMessageHandler
现在提供 deliveryModeExpression
和 timeToLiveExpression
选项,以确定在运行时要发送的 JMS 消息的相应 QoS 选项。DefaultJmsHeaderMapper
现在允许通过将 setMapInboundDeliveryMode()
和 setMapInboundExpiration()
选项设置为 true
,来映射入站 JMSDeliveryMode
和 JMSExpiration
属性。当停止 JmsMessageDrivenEndpoint
或 JmsInboundGateway
时,现在会关闭关联的侦听器容器;这会关闭其共享连接和任何使用者。您可以配置这些终结点以恢复到之前的行为。
有关更多信息,请参见 JMS Support。
HTTP/WebFlux Support
statusCodeExpression
(和 函数
)现在随 RequestEntity<?>
(用作求值上下文的根对象)一起提供,以便请求标头、方法、URI 和正文可用于目标状态代码计算。
有关更多信息,请参见 HTTP Support 和 WebFlux Support。
JMX Changes
如果对象名称键值包含 Java 标识符(或句点 .
)中不允许的任何字符,则现在会将其引用。例如 org.springframework.integration:type=MessageChannel,
name="input:foo.myGroup.errors"
。这会产生副作用,即之前包含此类字符的“允许”名称现在会变成引用。例如 org.springframework.integration:type=MessageChannel,
name="input#foo.myGroup.errors"
。
Micrometer Support Changes
现在,自定义框架创建的标准 Micrometer 仪表更容易了。有关更多信息,请参阅 Micrometer Integration。
Integration Graph Customization
现在可以通过 IntegrationGraphServer
上的 Function<NamedComponent, Map<String, Object>> additionalPropertiesCallback
,将其他属性添加到 IntegrationNode
中。有关详细信息,请参阅 Integration Graph。
Integration Global Properties
现在可以在日志中打印集成全局属性(包括默认值),前提是已针对 org.springframework.integration
类别开启 DEBUG
逻辑级别。有关更多信息,请参见 Global Properties。
The receiveTimeout
for @Poller
现在,{@Poller
} 注解提供了一个方便的 {receiveTimeout
} 选项。有关更多信息,请参见 {Using the @Poller
Annotation}。