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

以下组件在 5.1 中新增:

AmqpDedicatedChannelAdvice

Improved Function Support

现在,java.util.function 接口在 Framework 组件中获得了改进的集成支持。Kotlin lambda 函数现在也可以用于处理程序和源方法。

@LongRunningTest

提供了一个 JUnit 5 @LongRunningTest 条件注释,用于检查环境或系统属性,其中 RUN_LONG_INTEGRATION_TESTS 条目的值为 true,以确定是否运行或跳过测试。

General Changes

在 5.1 版本中进行了以下更改:

Java DSL

IntegrationFlowContext 现在是一个接口,IntegrationFlowRegistrationIntegrationFlowContext 的内部接口。

引入了新的 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(),因为该方法将被调用,无论是否收到消息。此外,PolledAmqpChannelPolledJmsChannel 以前没有使用 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

@Publisher annotation changes

从版本 5.1 开始,您必须通过使用 @EnablePublisher 或通过在 <int:annotation-config> 上使用 <int:enable-publisher> 子元素来显式启用 @Publisher AOP 功能。此外,已经添加 proxy-target-classorder 属性,以便调整 ProxyFactory 配置。

Files Changes

如果您正在使用 FileExistsMode.APPENDFileExistsMode.APPEND_NO_FLUSH,则可以提供一个 newFileCallback,该回调在创建新文件时会调用。此回调会接收新创建的文件和触发回调的消息。例如,这可用于写入 CSV 标头。

FileReadingMessageSource 现在只有在调用其 start() 之后才检查和创建目录。因此,如果 FileReadingMessageSource 的入站通道适配器具有 autoStartup = false,则在应用程序启动期间不会出现针对文件系统的故障。

有关更多信息,请参见 File Support

AMQP Changes

我们已在 DefaultAmqpHeaderMapper 中对 IDTimestamp 页眉映射进行了更改。有关更多信息,请参见 AMQP Message Headers 底部附近的注解。

contentType 标头现已正确映射为通用标头映射中的一个条目。有关更多信息,请参阅 contentType Header

从版本 5.1.3 起,如果在使用手动确认时发生消息转换异常,且已定义错误通道,则有效负载是一个 ManualAckListenerExecutionFailedException,它包含附加的 channeldeliveryTag 属性。这使得错误流对原始消息进行确认/否定。有关更多信息,请参见 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 DirectoriesInbound Channel Adapters: Polling Multiple Servers and Directories

此外,入站适配器 localFilenameExpression 实例可包含 #remoteDirectory 变量,其中包含所轮询的远程目录。用于对流媒体适配器的获取文件列表进行排序的比较器的泛型类型已从 Comparator<AbstractFileInfo<F>> 更改为 Comparator<F>。有关更多信息,请参见 FTP Streaming Inbound Channel AdapterSFTP Streaming Inbound Channel Adapter

此外,现在可以使用 Comparator 为入站通道适配器的同步器提供支持。当使用 maxFetchSize 限制检索的文件时,这一点非常有用。

CachingSessionFactory 有一个新属性 testSession,当该属性为 true 时,工厂将在从缓存中签出现有会话时对 Session 执行 test() 操作。

有关更多信息,请参见 SFTP Session CachingFTP Session Caching

出站网关 MPUT 命令现在支持带有文件或字符串集合的消息有效负载。有关更多信息,请参见 SFTP Outbound GatewayFTP 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 现在提供 deliveryModeExpressiontimeToLiveExpression 选项,以确定在运行时要发送的 JMS 消息的相应 QoS 选项。DefaultJmsHeaderMapper 现在允许通过将 setMapInboundDeliveryMode()setMapInboundExpiration() 选项设置为 true,来映射入站 JMSDeliveryModeJMSExpiration 属性。当停止 JmsMessageDrivenEndpointJmsInboundGateway 时,现在会关闭关联的侦听器容器;这会关闭其共享连接和任何使用者。您可以配置这些终结点以恢复到之前的行为。

有关更多信息,请参见 JMS Support

HTTP/WebFlux Support

statusCodeExpression(和 函数)现在随 RequestEntity<?>(用作求值上下文的根对象)一起提供,以便请求标头、方法、URI 和正文可用于目标状态代码计算。

有关更多信息,请参见 HTTP SupportWebFlux 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}。