# 变更历史

## 变更历史

### 5.3 和 5.4 之间的变化

### 新组件

#### 用于 Apache Kafka 的通道适配器

独立的[Spring Integration for Apache Kafka](https://projects.spring.io/spring-integration-kafka/)项目已合并为该项目的`spring-integration-kafka`模块。

`KafkaProducerMessageHandler``sendTimeoutExpression`默认值已更改。

现在可以访问底层`send()`操作的`Future<?>`。

有关更多信息，请参见[Spring for Apache Kafka Support](./kafka.html#kafka)。

#### R2DBC 通道适配器

介绍了用于 R2DBC 数据库交互的通道适配器。有关更多信息，请参见[R2DBC 支持](./r2dbc.html#r2dbc)。

#### Redis 流支持

Redis 流支持的通道适配器已经引入。有关更多信息，请参见[Redis 流出站通道适配器](./redis.html#redis-stream-outbound)。

#### 可更新锁定注册中心

引入了一个可更新的锁注册中心，以允许对分布式锁进行更新租赁。有关更多信息，请参见[JDBC 实现](./jdbc.html#jdbc-lock-registry)。

#### zeromq 支持

已经引入了`ZeroMqChannel`、`ZeroMqMessageHandler`和`ZeroMqMessageProducer`。有关更多信息，请参见[ZeroMQ 支持](./zeromq.html#zeromq)。

### 一般变化

单向消息传递网关（`void`方法返回类型）现在将`nullChannel`显式地设置到`replyChannel`头中，以忽略任何可能的下游回复。有关更多信息，请参见[设置默认回复通道](./gateway.html#gateway-default-reply-channel)。

另外，网关方法调用者（`GatewayProxyFactoryBean.MethodInvocationGateway`）现在提供了托管 Bean 名称，作为网关代理 Bean 名称加上方法签名的组合。例如：`sampleGateway#echo(String)`。这会影响为网关方法调用公开的消息历史和度量，还会在应用程序上下文的启动和关闭期间提供细粒度的日志。

聚合器（和 Resequencer）现在可以使孤立的组（在持久存储中的组）过期，在应用程序重新启动后，不会有新消息到达该存储）。有关更多信息，请参见[聚合器到期的组](./aggregator.html#aggregator-expiring-groups)。

被千分尺取代的传统度量标准已被删除。

[螺纹屏障](./barrier.html#barrier)现在有两个独立的超时选项：`requestTimeout`和`triggerTimeout`。

### TCP/UDP 更改

连接工厂现在支持多个发送组件（`TcpSender`）；它们仍然限于一个接收组件（`TcpListener`）。例如，这允许入站网关和出站通道适配器共享相同的工厂，支持从服务器到客户机的请求/回复和任意消息传递。除非使用一次性连接或`ThreadAffinityClientConnectionFactory`，否则不应将共享工厂与出站网关一起使用。有关更多信息，请参见[协作通道适配器](./ip.html#ip-collaborating-adapters)和[TCP 网关](./ip.html#tcp-gateways)。

现在可以将 UDP 通道适配器配置为`SocketCustomizer`，这允许设置适配器不直接支持的套接字属性。有关更多信息，请参见[UDP 适配器](./ip.html#udp-adapters)。

### RMI 变化

`spring-integration-rmi`模块不推荐使用，不提供替换，并将在下一个主要版本中删除。有关更多信息，请参见[RMI 支助](./rmi.html#rmi)。

### AMQP 变化

出站端点现在有了处理发布服务器确认和返回的新机制。有关更多信息，请参见[发布服务器确认和返回的替代机制](./amqp.html#alternative-confirms-returns)。

新的`BatchMode.EXTRACT_PAYLOAD_WITH_HEADERS`由`AmqpInboundChannelAdapter`支持。有关更多信息，请参见[入站通道适配器](./amqp.html#amqp-inbound-channel-adapter)。

### 邮件更改

`AbstractMailReceiver`现在可以生成`MimeMessage`as-is，而无需急于获取其内容。有关更多信息，请参见[邮件接收通道适配器](./mail.html#mail-inbound)。

### 5.2 与 5.3 之间的变化

### 新组件

#### 集成模式

引入了`IntegrationPattern`抽象，以指示哪个 Enterprise 集成模式（an`IntegrationPatternType`）和类别 A Spring 集成组件属于哪个。有关此抽象及其用例的更多信息，请参见其 Javadocs 和[积分图](./graph.html#integration-graph)。

#### `ReactiveMessageHandler`

现在框架中原生支持`ReactiveMessageHandler`。有关更多信息，请参见[reactiveMessageHandler](./reactive-streams.html#reactive-message-handler)。

#### `ReactiveMessageSourceProducer`

`ReactiveMessageSourceProducer`是`MessageProducerSupport`的一个反应性实现，用于将所提供的`MessageSource`封装到`Flux`中，用于按需`receive()`调用。有关更多信息，请参见[反应流支持](./reactive-streams.html#reactive-streams)。

#### Java DSL 扩展

引入了一个新的`IntegrationFlowExtension`API，允许使用定制或组合的 EIP 操作符扩展现有的 Java DSL。这也可以用于为任何开箱即用的`IntegrationComponentSpec`扩展引入自定义程序。有关更多信息，请参见[DSL 扩展](./dsl.html#java-dsl-extensions)。

####  Kotlin dsl

Kotlin 介绍了用于集成流配置的 DSL。有关更多信息，请参见[Kotlin DSL Chapter](./kotlin-dsl.html#kotlin-dsl)。

#### reactiverequesthandleradvice

提供了一个`ReactiveRequestHandlerAdvice`来自定义消息处理程序的`Mono`回复。有关更多信息，请参见[反应性建议](./handler-advice.html#reactive-advice)。

#### 处理 MessageAdviceAdapter

提供了一个`HandleMessageAdviceAdapter`来包装任何`MethodInterceptor`，用于在`MessageHandler.handleMessage()`上应用，而不是默认的`AbstractReplyProducingMessageHandler.RequestHandler.handleRequestMessage()`行为。有关更多信息，请参见[处理消息建议](./handler-advice.html#handle-message-advice)。

#### MongoDB 反应通道适配器

`spring-integration-mongodb`模块现在为 Spring 数据中的反应式 MongoDB 驱动程序支持提供通道适配器实现。另外，对于 MongoDB 变更流支持的一个反应性实现存在于`MongoDbChangeStreamMessageProducer`中。有关更多信息，请参见[MongoDB 支持](./mongodb.html#mongodb)。

#### 收到邮件通知

一个特殊的`ReceiveMessageAdvice`已被引入到代理中，正好是`MessageSource.receive()`或`PollableChannel.receive()`。有关更多信息，请参见[智能轮询](./polling-consumer.html#smart-polling)。

### 一般更改

Gateway Proxy 现在默认不代理`default`方法。有关更多信息，请参见[调用`default`方法]。

内部组件（例如`_org.springframework.integration.errorLogger`）现在在积分图中表示时具有缩短的名称。有关更多信息，请参见[积分图](./graph.html#integration-graph)。

在聚合器中，当`MessageGroupProcessor`返回`Message`时，如果`sequenceDetails`与组的第一条消息中的头匹配，则在输出消息上执行`MessageBuilder.popSequenceDetails()`。有关更多信息，请参见[聚合器编程模型](./aggregator.html#aggregator-api)。

在 Java DSL 中添加了一个新的`publishSubscribeChannel()`操作符，该操作符基于`BroadcastCapableChannel`和`BroadcastPublishSubscribeSpec`。当我们为经纪人支持的通道（如`SubscribableJmsChannel`，`SubscribableRedisChannel`等）将子流配置为发布-订阅服务器时，这种 Fluent API 具有其优势。有关更多信息，请参见[子流支持](./dsl.html#java-dsl-subflows)。

Spring 集成中的事务支持现在还包括配置`ReactiveTransactionManager`的选项，如果`MessageSource`或`MessageHandler`实现产生了用于发送有效负载的反应性类型。有关更多信息，请参见`TransactionInterceptorBuilder`。另见[被动交易](./transactions.html#reactive-transactions)。

在 Java DSL 中添加了一个新的`intercept()`运算符，可以在不创建显式通道的情况下注册`ChannelInterceptor`实例。有关更多信息，请参见[操作员截获（）](./dsl.html#java-dsl-intercept)。

`MessageStoreSelector`有一个新的机制来比较新旧的值。有关更多信息，请参见[幂等接收机 Enterprise 集成模式](./handler-advice.html#idempotent-receiver)。

现在，`MessageProducerSupport`基类有一个`subscribeToPublisher(Publisher<? extends Message<?>>)`API，允许实现消息驱动的生产者端点，这些生产者端点通过反应性`Publisher`发送消息。有关更多信息，请参见[反应流支持](./reactive-streams.html#reactive-streams)。

### AMQP 变化

出站通道适配器有一个新的属性`multiSend`，允许在一个`RabbitTemplate`调用的范围内发送多个消息。有关更多信息，请参见[AMQP 出站通道适配器](./amqp.html#amqp-outbound-channel-adapter)。

入站通道适配器现在支持一个侦听器容器，其`consumerBatchEnabled`属性设置为`true`。见[AMQP 入站通道适配器](./amqp.html#amqp-inbound-channel-adapter)

### http 更改

在`AbstractHttpRequestExecutingMessageHandler`上的`encodeUri`属性已被弃用，以支持新引入的`encodingMode`。有关更多信息，请参见`DefaultUriBuilderFactory.EncodingMode`Javadocs 和[控制 URI 编码](./http.html#http-uri-encoding)。这也会影响`WebFluxRequestExecutingMessageHandler`、相应的 Java DSL 和 XML 配置。将相同的选项添加到`AbstractWebServiceOutboundGateway`中。

### Web 服务变更

已经为 Web 服务组件添加了 Java DSL 支持。在`AbstractWebServiceOutboundGateway`上的`encodeUri`属性已被弃用，以支持新引入的`encodingMode`-类似于上面的 HTTP 更改。有关更多信息，请参见[Web 服务支持](./ws.html#ws)。

### TCP 更改

默认情况下，在当前连接失败之前，`FailoverClientConnectionFactory`不再会再次失败。有关更多信息，请参见[TCP 故障转移客户端连接工厂](./ip.html#failover-cf)。

`TcpOutboundGateway`现在支持异步请求/回复。有关更多信息，请参见[TCP 网关](./ip.html#tcp-gateways)。

现在，你可以将客户端连接配置为对新连接执行一些任意的测试。有关更多信息，请参见[测试连接](./ip.html#testing-connections)。

### rsocket 更改

`decodeFluxAsUnit`选项已被添加到`RSocketInboundGateway`中，其含义是将传入的`Flux`作为单个单元进行解码，或对其中的每个事件应用解码。有关更多信息，请参见[RSocket 入站网关](./rsocket.html#rsocket-inbound)。

### 动物园管理员变更

`LeaderInitiatorFactoryBean`（以及其 XML`<int-zk:leader-listener>`）公开了一个`candidate`选项，用于对`Candidate`配置进行更多控制。有关更多信息，请参见[领导事件处理](./zookeeper.html#zk-leadership)。

### MQTT 变化

现在可以将入站通道适配器配置为在消息被确认为已发送时为用户提供控制。有关更多信息，请参见[手动 ACK](./mqtt.html#mqtt-ack-mode)。

当连接无法创建或丢失时，出站适配器现在会发布`MqttConnectionFailedEvent`。以前，只有入站适配器才会这样做。见[MQTT 事件](./mqtt.html#mqtt-events)。

### （s）FTP 更改

`FileTransferringMessageHandler`（例如对于 FTP 和 SFTP）除了`File`、`byte[]`、`String`和`InputStream`之外，现在还支持`org.springframework.core.io.Resource`。有关更多信息，请参见[SFTP 支持](./sftp.html#sftp)和[FTP 支持](./ftp.html#ftp)。

### 文件更改

对于`markersJson`模式，`FileSplitter`不再需要 Jackson 处理器（或类似的）依赖关系。它使用`SimpleJsonSerializer`表示`FileSplitter.FileMarker`实例的简单字符串表示。有关更多信息，请参见[文件夹](./file.html#file-splitter)。

### 5.1 和 5.2 之间的变化

### 包和类的更改

`Pausable`已从`o.s.i.endpoint`移动到`o.s.i.core`。

### 行为变化

请参阅[迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-5.1-to-5.2-Migration-Guide)关于此版本中的行为更改。

### 新组件

#### RSocket 支持

`spring-integration-rsocket`模块现在可以在支持 RSocket 协议的通道适配器实现中使用。有关更多信息，请参见[RSocket 支持](./rsocket.html#rsocket)。

#### 利率限制建议支持

`RateLimiterRequestHandlerAdvice`现在可用于限制处理程序的请求速率。有关更多信息，请参见[速率限制器建议](./handler-advice.html#rate-limiter-advice)。

#### 缓存建议支持

`CacheRequestHandlerAdvice`现在可用于在处理程序上缓存请求结果。有关更多信息，请参见[缓存建议](./handler-advice.html#cache-advice)。

####  Kotlin 脚本支持

JSR223 脚本模块现在包括对 Kotlin 脚本的支持。有关更多信息，请参见[脚本支持](./scripting.html#scripting)。

#### 流量聚合器支持

`FluxAggregatorMessageHandler`现在可用于基于 Project Reactor`Flux`操作符的消息逻辑的分组和窗口。有关更多信息，请参见[通量聚合器](./aggregator.html#flux-aggregator)。

#### FTP/SFTP 事件发布者

FTP 和 SFTP 模块现在为某些 Apache Mina FTP/SFTP 服务器事件提供了一个事件侦听器。有关更多信息，请参见[Apache Mina FTP 服务器事件](./ftp.html#ftp-server-events)和[Apache Mina SFTP 服务器事件](./sftp.html#sftp-server-events)。

#### AVRO 变压器

现在提供了简单的 Apache AVRO 变压器。有关更多信息，请参见[AVRO 变压器](./transformers.html#avro-transformers)。

### 一般变化

现在，`JsonToObjectTransformer`支持将目标对象反序列化为泛型。有关更多信息，请参见[JSON 变形金刚](./transformer.html#json-transformers)。

`splitter`现在支持`discardChannel`配置选项。有关更多信息，请参见[Splitter](./splitter.html#splitter)。

控制总线现在可以处理`Pausable`（`Lifecycle`的扩展）操作。有关更多信息，请参见[控制总线](./control-bus.html#control-bus)。

为聚合器组件引入了`Function<MessageGroup, Map<String, Object>>`策略，用于合并和计算输出消息的头。有关更多信息，请参见[聚合器编程模型](./aggregator.html#aggregator-api)。

在框架中抛出的所有`MessageHandlingException`s，现在包括一个 Bean 资源和用于反向跟踪配置部分的源，以防不涉及最终用户代码。有关更多信息，请参见[错误处理](./error-handling.html#error-handling)。

为了获得更好的最终用户体验，Java DSL 现在提供了一个配置变量，用于通过网关接口启动流。有关更多信息，请参见`IntegrationFlows.from(Class<?> serviceInterface, Consumer<GatewayProxySpec> endpointConfigurer)`Javadocs。另外，`MethodArgsHolder`现在是用于`GatewayProxyFactoryBean`中所有表达式的求值上下文的根对象。现在不推荐`#args`和`#method`评估上下文变量。有关更多信息，请参见[消息传递网关](./gateway.html#gateway)。

#### AMQP 变化

如果在超时期间没有收到发布者确认，那么出站端点现在可以被配置为合成“NACK”。有关更多信息，请参见[出站通道适配器](./amqp.html#amqp-outbound-endpoints)。

入站通道适配器现在可以作为`List<?>`有效负载接收批处理的消息，而不是为每个批处理片段接收离散的消息。有关更多信息，请参见[批处理消息](./amqp.html#amqp-debatching)。

现在可以将出站通道适配器配置为阻止调用线程，直到收到发布者确认（确认）。有关更多信息，请参见[出站通道适配器](./amqp.html#amqp-outbound-channel-adapter)。

#### 文件更改

对过滤远程文件进行了一些改进。有关更多信息，请参见[远程持久文件列表过滤器](./file.html#remote-persistent-flf)。

#### TCP 更改

`ByteArrayLengthHeaderSerializer`使用的长度标头现在可以在有效负载之外包括标头的长度。有关更多信息，请参见[消息划分（序列化器和反序列化器）](./ip.html#tcp-codecs)。

当使用`TcpNioServerConnectionFactory`时，现在优先考虑接受新的连接，而不是从现有连接中读取新的连接，但是它是可配置的。有关更多信息，请参见[关于非阻塞 I/O（蔚来）](./ip.html#note-nio)。

出站网关有一个新的属性`closeStreamAfterSend`；当与新的连接一起使用时，对于每个请求/应答它向服务器发出 EOF 信号，而不关闭连接。这对于使用 EOF 来表示消息结束而不是数据中的某些分隔符的服务器很有用。有关更多信息，请参见[TCP 网关](./ip.html#tcp-gateways)。

客户机连接工厂现在支持`connectTimeout`，如果在此期间没有建立连接，则会引发异常。有关更多信息，请参见[TCP 连接工厂](./ip.html#tcp-connection-factory)。

`SoftEndOfStreamException`现在是`RuntimeException`，而不是扩展`IOException`。

#### 邮件更改

`AbstractMailReceiver`现在有一个`autoCloseFolder`选项（默认情况下是`true`），可以在获取后禁用自动文件夹关闭，但是填充`IntegrationMessageHeaderAccessor.CLOSEABLE_RESOURCE`头，以进行下游交互。有关更多信息，请参见[邮件接收通道适配器](./mail.html#mail-inbound)。

#### http 更改

HTTP 入站端点现在支持请求有效负载验证。有关更多信息，请参见[HTTP 支持](./http.html#http)。

#### WebFlux 更改

`WebFluxRequestExecutingMessageHandler`现在支持`Publisher`、`Resource`和`MultiValueMap`作为请求消息`payload`。`WebFluxInboundEndpoint`现在支持请求有效负载验证。有关更多信息，请参见[WebFlux 支持](./webflux.html#webflux)。

#### MongoDB 变更

现在可以将`MongoDbMessageStore`配置为自定义转换器。有关更多信息，请参见[MongoDB 支持](./mongodb.html#mongodb)。

#### 路由器变更

现在你可以禁用返回通道键作为通道 Bean 名称。有关更多信息，请参见[动态路由器](./router.html#dynamic-routers)。

#### ftp/sftp 更改

现在将`RotatingServerAdvice`与`RotationPolicy`及其`StandardRotationPolicy`解耦。

远程文件信息，包括主机/端口和目录，现在包含在`AbstractInboundFileSynchronizingMessageSource`和`AbstractRemoteFileStreamingMessageSource`实现中的消息头中。这一信息也包括在`AbstractRemoteFileOutboundGateway`实现的读取操作结果中的标题中。FTP 出站端点现在支持`chmod`更改上载文件的权限。（SFTP 从 4.3 版本开始就支持它了）。有关更多信息，请参见[FTP 支持](./ftp.html#ftp)和[SFTP 支持](./sftp.html#sftp)。

### 5.0 和 5.1 之间的变化

#### 新组件

以下组件是 5.1 中的新组件：

* [`AmqpDedicatedChannelAdvice`]（#x5.1-amqpdedicatedchanneladvice）

##### `AmqpDedicatedChannelAdvice`

见[严格的消息排序](./amqp.html#amqp-strict-ordering)。

##### 功能支持改进

`java.util.function`接口现在在框架组件中具有改进的集成支持。 Kotlin Lambdas 现在也可以用于处理程序和源方法。

参见[`java.util.function`接口支持]。

##### `@LongRunningTest`

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

见[JUnit 规则和条件](./testing.html#test-junit-rules)。

#### 一般变动

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

* [Java DSL](#x5.1-java-dsl)

* [调度器异常](#x5.1-dispatcher-exceptions)

* [全球信道拦截器](#x5.1-global-channel-interceptors)

* [`ObjectToJsonTransformer`]（#x5.1-object-to-json-transformer）

* [Integration Flows: Generated Bean Names](#x5.1-integration-flows-generated-bean-names)

* [聚合器更改](#x5.1-aggregator)

* [@Publisher 注释更改](#x5.1-publisher)

* [集成图定制](#x51.-integration-graph)

* [集成全局属性](#x51.-global-properties)

* [`receiveTimeout`for`@Poller`]（#x51.-poller-annotation）

##### Java DSL

`IntegrationFlowContext`现在是一个接口，`IntegrationFlowRegistration`是`IntegrationFlowContext`的一个内部接口。

引入了一个新的`logAndReply()`操作符，以便在流的末尾记录请求-回复配置时使用。这避免了与`log()`的混淆，后者被视为单向结束流组件。

Bean 在集成流中为任何`NamedComponent`生成的名称现在基于组件类型，以便从可视化工具、日志分析器和度量收集器获得更好的可读性。

`GenericHandler.handle()`现在排除了第二个参数的`MessageHeaders`类型。

##### Dispatcher 异常

由`AbstractDispatcher`捕获和重新抛出的异常现在更加一致：

* 具有`failedMessage`属性的任何类型的`MessagingException`都将被重新抛出，保持不变。

* 所有其他异常都包装在`MessageDeliveryException`中，并带有`failedMessage`属性集。

以前：

* 具有`failedMessage`属性的任何类型的`MessagingException`都会被重新抛出，不变。

* 没有`failedMessage`属性的`MessagingException`被包装在`MessagingException`中，并带有`failedMessage`属性集。

* 其他`RuntimeException`实例被重新抛出，保持不变。

* 选中的异常被包装在带有`failedMessage`属性集的`MessageDeliveryException`中。

##### 全局信道拦截器

全局信道拦截器现在应用于动态注册的信道，例如在使用 Java DSL 或使用`beanFactory.initializeBean()`初始化的 bean 时通过`IntegrationFlowContext`。以前，当应用程序上下文被刷新后创建 bean 时，拦截程序不会被应用。

##### 信道拦截器

当没有收到消息时，将不再调用`ChannelInterceptor.postReceive()`；不再需要检查`null``Message<?>`。以前，这种方法被称为。如果你的拦截器依赖于前面的行为，那么可以实现`afterReceiveCompleted()`，因为无论是否接收到消息，该方法都会被调用。此外，`PolledAmqpChannel`和`PolledJmsChannel`以前不会用`afterReceiveCompleted()`调用`afterReceiveCompleted()`；现在它们会调用。

##### `ObjectToJsonTransformer`

为`ObjectToJsonTransformer`引入了一个新的`ResultType.BYTES`模式。

有关更多信息，请参见[JSON 变形金刚](./transformer.html#json-transformers)。

##### 集成流：生成的 Bean 名称

从版本 5.0.5 开始，在`IntegrationFlow`中为组件生成的 Bean 名称包括流 Bean 名称，然后是一个点，作为前缀。例如，如果一个流 Bean 被命名为`flowBean`，那么生成的 Bean 可能被命名为`flowBean.generatedBean`。

有关更多信息，请参见[处理消息流](./dsl.html#java-dsl-flows)。

##### 聚合器更改

如果`groupTimeout`被求值为负值，聚合器现在立即使该组过期。只有`null`被认为是对当前消息不做任何事情的信号。

引入了一个新的`popSequence`属性，允许（默认情况下）为输出消息调用`MessageBuilder.popSequenceDetails()`。另外，`AbstractAggregatingMessageGroupProcessor`现在返回`AbstractIntegrationMessageBuilder`，而不是整个`Message`，以进行优化。

有关更多信息，请参见[Aggregator](./aggregator.html#aggregator)。

##### @publisher 注释更改

从版本 5.1 开始，你必须使用`@EnablePublisher`或在`<int:annotation-config>`上使用`<int:enable-publisher>`子元素来显式地打开`@Publisher` AOP 功能。还添加了`proxy-target-class`和`order`属性，用于优化`ProxyFactory`配置。

有关更多信息，请参见[使用`@Publisher`注释的注释驱动配置]。

#### 文件更改

如果使用`FileExistsMode.APPEND`或`FileExistsMode.APPEND_NO_FLUSH`，则可以提供一个`newFileCallback`，在创建新文件时将调用它。此回调接收新创建的文件和触发回调的消息。例如，这可以用来编写一个 CSV 标头。

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

有关更多信息，请参见[文件支持](./file.html#files)。

#### AMQP 变化

我们已经在`ID`和`Timestamp`头映射中对`DefaultAmqpHeaderMapper`进行了更改。有关更多信息，请参见[AMQP 消息头](./amqp.html#amqp-message-headers)底部附近的注释。

`contentType`标头现在被正确地映射为 General Headers 映射中的一个条目。有关更多信息，请参见[ContentType 标头](./amqp.html#amqp-content-type)。

从版本 5.1.3 开始，如果在使用手动确认时发生消息转换异常，并且定义了错误通道，则有效负载是带有额外`ManualAckListenerExecutionFailedException`和`deliveryTag`属性的`ManualAckListenerExecutionFailedException`。这使错误流能够 ACK/NACK 原始消息。有关更多信息，请参见[入站消息转换](./amqp.html#amqp-conversion-inbound)。

#### JDBC 更改

在 JDBC 入站通道适配器和 JDBC 出站网关上的一个令人困惑的`max-rows-per-poll`属性已被弃用，取而代之的是新引入的`max-rows`属性。

当请求消息的有效负载是`Iterable`类型的实例时，`JdbcMessageHandler`现在支持`batchUpdate`功能。

`INT_CHANNEL_MESSAGE`表（`JdbcChannelMessageStore`）的索引已经优化。如果在这样的存储区中有大的消息组，则可能希望更改索引。

有关更多信息，请参见[JDBC 支持](./jdbc.html#jdbc)。

#### FTP 和 SFTP 更改

现在可以使用`RotatingServerAdvice`用入站通道适配器轮询多个服务器和目录。有关更多信息，请参见[入站通道适配器：轮询多个服务器和目录](./ftp.html#ftp-rotating-server-advice)和[入站通道适配器：轮询多个服务器和目录](./sftp.html#sftp-rotating-server-advice)。

此外，入站适配器`localFilenameExpression`实例可以包含`#remoteDirectory`变量，该变量包含正在轮询的远程目录。比较器的通用类型（用于对流适配器的获取文件列表进行排序）已从`Comparator<AbstractFileInfo<F>>`更改为`Comparator<F>`。有关更多信息，请参见[FTP 流入站通道适配器](./ftp.html#ftp-streaming)和[SFTP 流入站通道适配器](./sftp.html#sftp-streaming)。

此外，用于入站通道适配器的同步器现在可以提供一个`Comparator`。这在使用`maxFetchSize`限制检索的文件时很有用。

`CachingSessionFactory`具有一个新的属性`testSession`，如果该属性为真，则当从缓存中签出一个已存在的会话时，工厂将在`test()`上执行一个`test()`操作。

有关更多信息，请参见[SFTP Session Caching](./sftp.html#sftp-session-caching)和[FTP Session Caching](./ftp.html#ftp-session-caching)。

出站网关 mput 命令现在支持带有文件或字符串集合的消息有效负载。有关更多信息，请参见[SFTP 出站网关](./sftp.html#sftp-outbound-gateway)和[FTP 出站网关](./ftp.html#ftp-outbound-gateway)。

#### TCP 支持

在使用 SSL 时，现在默认情况下启用了主机验证，以防止使用受信任证书的中间人攻击。有关更多信息，请参见[主机验证](./ip.html#tcp-ssl-host-verification)。

此外，键和信任存储类型现在可以在`DefaultTcpSSLContextSupport`上配置。

#### Twitter 支持

由于 Spring 社交项目已经转移到[生命终结状态](https://spring.io/blog/2018/07/03/spring-social-end-of-life-announcement)， Spring 集成中的 Twitter 支持已经转移到扩展项目中。有关更多信息，请参见[Spring Integration Social Twitter](https://github.com/spring-projects/spring-integration-extensions/tree/main/spring-integration-social-twitter)。

#### JMS 支持

`JmsSendingMessageHandler`现在提供`deliveryModeExpression`和`timeToLiveExpression`选项，以确定在运行时要发送的 JMS 消息的相应 QoS 选项。现在，`DefaultJmsHeaderMapper`允许通过设置`true`相应的`setMapInboundDeliveryMode()`和`setMapInboundExpiration()`选项来映射入站`JMSExpiration`属性。当`JmsMessageDrivenEndpoint`或`JmsInboundGateway`被停止时，关联的侦听器容器现在被关闭；这将关闭其共享连接和任何使用者。你可以将端点配置为恢复到以前的行为。

有关更多信息，请参见[JMS 支持](./jms.html#jms)。

#### http/webflux 支持

`statusCodeExpression`（和`Function`）现在提供了`RequestEntity<?>`作为求值上下文的根对象，因此可以使用请求头、方法、URI 和主体来计算目标状态代码。

有关更多信息，请参见[HTTP 支持](./http.html#http)和[WebFlux 支持](./webflux.html#webflux)。

#### JMX 更改

如果对象名称键值包含 Java 标识符（或句点`.`）中所允许的字符以外的任何字符，则现在引用它们。例如`org.springframework.integration:type=MessageChannel,``name="input:foo.myGroup.errors"`。这样做的副作用是，以前“允许”的名字，加上这样的字符，现在会被引用。例如`org.springframework.integration:type=MessageChannel,``name="input#foo.myGroup.errors"`。

#### 千分尺支持变更

现在可以更简单地定制由该框架创建的标准千分表。有关更多信息，请参见[千分尺积分](./metrics.html#micrometer-integration)。

#### 集成图定制

现在可以在`IntegrationGraphServer`上通过`Function<NamedComponent, Map<String, Object>> additionalPropertiesCallback`向`IntegrationNode`s 添加附加属性。有关更多信息，请参见[积分图](./graph.html#integration-graph)。

#### 集成全局属性

当打开`org.springframework.integration`类别的`DEBUG`逻辑级别时，现在可以在日志中打印集成全局属性（包括默认值）。有关更多信息，请参见[全局属性](./configuration.html#global-properties)。

#### `receiveTimeout`的`@Poller`

为了方便起见，`@Poller`注释现在提供了`receiveTimeout`选项。请参阅[使用`@Poller`注释]（./configuration.html#configuration-using-poller-annotation）以获取更多信息。

### 4.3 到 5.0 之间的变化

有关可能影响应用程序的重要更改，请参见[迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-4.3-to-5.0-Migration-Guide)。你可以在[wiki](https://github.com/spring-projects/spring-integration/wiki)上找到所有回到 2.1 版本的迁移指南。

#### 新组件

5.0 版本增加了许多新的组件。

##### Java DSL

单独的[Spring Integration Java DSL](https://github.com/spring-projects/spring-integration-java-dsl)项目现在已合并到核心 Spring 集成项目中。用于通道适配器和网关的`IntegrationComponentSpec`实现被分发到它们的特定模块。有关 Java DSL 支持的更多信息，请参见[Java DSL](./dsl.html#java-dsl)。另请参见[4.3 到 5.0 迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-4.3-to-5.0-Migration-Guide#java-dsl)，以了解移动到 Spring Integration5.0 所需的步骤。

##### 测试支持

我们创建了一个新的 Spring 集成测试框架，以帮助测试 Spring 集成应用程序。现在，使用测试类上的`@SpringIntegrationTest`注释和`MockIntegration`工厂，你可以使集成流的 JUnit 测试变得更容易一些。

有关更多信息，请参见[测试支持](./testing.html#testing)。

##### MongoDB 出站网关

新的`MongoDbOutboundGateway`允许你通过向数据库的请求通道发送消息，按需对数据库进行查询。

有关更多信息，请参见[MongoDB 出站网关](./mongodb.html#mongodb-outbound-gateway)。

##### WebFlux 网关和通道适配器

我们介绍了用于 Spring WebFlux 框架网关和通道适配器的新的 WebFlux 支持模块。

有关更多信息，请参见[WebFlux 支持](./webflux.html#webflux)。

##### 内容类型转换

既然我们使用了新的基于`InvocableHandlerMethod`的基础架构来进行服务方法调用，那么我们就可以执行`contentType`从有效负载到目标方法参数的转换。

有关更多信息，请参见[内容类型转换](./endpoint.html#content-type-conversion)。

##### `ErrorMessagePublisher`和`ErrorMessageStrategy`

我们添加了`ErrorMessagePublisher`和`ErrorMessageStrategy`来创建`ErrorMessage`实例。

有关更多信息，请参见[错误处理](./error-handling.html#error-handling)。

##### JDBC 元数据存储

我们添加了`MetadataStore`实现的 JDBC 实现。当你需要确保元数据的事务边界时，这是非常有用的。

有关更多信息，请参见[JDBC 元数据存储](./jdbc.html#jdbc-metadata-store)。

#### 一般更改

Spring 集成现在完全基于 Spring 框架`5.0`和项目反应堆`3.1`。以前的 Project Reactor 版本不再支持。

##### 核心变化

`@Poller`注释现在具有`errorChannel`属性，以便更轻松地配置底层`MessagePublishingErrorHandler`。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

所有请求-应答端点（基于`AbstractReplyProducingMessageHandler`）现在都可以启动事务，因此，使整个下游流具有事务性。有关更多信息，请参见[事务支持](./handler-advice.html#tx-handle-message-advice)。

现在，`SmartLifecycleRoleController`提供了获取角色中端点状态的方法。有关更多信息，请参见[端点角色](./endpoint.html#endpoint-roles)。

默认情况下，POJO 方法现在通过使用`InvocableHandlerMethod`调用，但是你可以像以前一样将它们配置为使用 SPEL。有关更多信息，请参见[POJO 方法调用](./overview.html#pojo-invocation)。

当以 POJO 方法为消息处理程序时，你现在可以使用`@Default`注释标记其中一个服务方法，以便为不匹配的条件提供一种后备机制。有关更多信息，请参见[配置服务激活器](./service-activator.html#service-activator-namespace)。

我们添加了一个简单的`PassThroughTransactionSynchronizationFactory`，以始终在当前事务上下文中存储轮询消息。该消息用作`failedMessage`属性的`MessagingException`，该属性包装事务完成期间抛出的任何原始异常。有关更多信息，请参见[事务同步](./transactions.html#transaction-synchronization)。

基于聚合器表达式的`ReleaseStrategy`现在根据`MessageGroup`计算表达式，而不是仅根据`Message<?>`的集合计算表达式。有关更多信息，请参见[Aggregators and Spring Expression Language (SpEL)](./aggregator.html#aggregator-spel)。

你现在可以用定制的`JsonObjectMapper`提供`ObjectToMapTransformer`。

有关更多信息，请参见[Aggregators and Spring Expression Language (SpEL)](./aggregator.html#aggregator-spel)。

`@GlobalChannelInterceptor`注释和`<int:channel-interceptor>`现在支持组件名称匹配的负模式（通过`!`前置）。有关更多信息，请参见[全局信道拦截器配置](./channel.html#global-channel-configuration-interceptors)。

当候选者未能获得锁时，`LockRegistryLeaderInitiator`现在通过`DefaultLeaderEventPublisher`发出一个新的`OnFailedToAcquireMutexEvent`。有关更多信息，请参见`[Leadership Event Handling](./endpoint.html#leadership-event-handling)`。

##### 网关更改

当网关方法具有`void`返回类型并且提供了错误通道时，网关现在正确地设置`errorChannel`报头。在此之前，头文件是不填充的。这导致同步下游流（在调用线程上运行）将异常发送到配置的通道，但是异步下游流上的异常将被发送到默认的`errorChannel`。

`RequestReplyExchanger`接口现在有一个`throws MessagingException`子句，以满足建议的消息交换契约。

现在可以使用 SPEL 表达式指定请求和回复超时。有关更多信息，请参见[消息传递网关](./gateway.html#gateway)。

##### 聚合器性能更改

默认情况下，聚合器现在使用`SimpleSequenceSizeReleaseStrategy`，这更有效，尤其是对于大型组。空组现在被安排在`empty-group-min-timeout`之后被删除。有关更多信息，请参见[Aggregator](./aggregator.html#aggregator)。

##### 拆分器更改

Splitter 组件现在可以处理和分割 Java`Stream`和反应流`Publisher`对象。如果输出通道是`ReactiveStreamsSubscribableChannel`，则`AbstractMessageSplitter`构建一个`Flux`用于后续迭代，而不是常规的`Iterator`，这与被分割的对象无关。此外，`AbstractMessageSplitter`提供了`protected obtainSizeIfPossible()`方法，以允许确定`Iterable`和`Iterator`对象的大小，如果这是可能的话。有关更多信息，请参见[Splitter](./splitter.html#splitter)。

##### JMS 更改

以前， Spring Integration JMS XML 配置对 JMS 连接工厂使用默认的 Bean 名称`connectionFactory`，这使得组件定义中省略了该属性。我们将其重命名为`jmsConnectionFactory`，这是 Spring 引导用于自动配置 JMS 连接工厂 Bean 的 Bean 名称。

如果你的应用程序依赖于先前的行为，那么你可以将你的`connectionFactory` Bean 重命名为`jmsConnectionFactory`，或者通过使用其当前名称来专门配置组件以使用你的 Bean。有关更多信息，请参见[JMS 支持](./jms.html#jms)。

##### 邮件更改

一些与呈现 IMAP 邮件内容的不一致之处已得到解决。有关更多信息，请参见[“邮件接收通道适配器”部分中的注释](./mail.html#imap-format-important)。

##### 提要更改

而不是`com.rometools.fetcher.FeedFetcher`，这在罗马是不受欢迎的，我们为`FeedEntryMessageSource`引入了一个新的`Resource`属性。有关更多信息，请参见[馈源适配器](./feed.html#feed)。

##### 文件更改

我们引入了新的`FileHeaders.RELATIVE_PATH`消息头来表示`FileReadingMessageSource`中的相对路径。

尾部适配器现在支持`idleEventInterval`在该期间文件中没有数据时发出事件。

`FileWritingMessageHandler`的 flush 谓词现在有了一个额外的参数。

文件出站通道适配器和网关（`FileWritingMessageHandler`）现在支持`REPLACE_IF_MODIFIED``FileExistsMode`。

它们现在还支持在新编写的文件上设置文件权限。

一个新的`FileSystemMarkerFilePresentFileListFilter`现在可用。有关更多信息，请参见[处理不完整的数据](./file.html#file-incomplete)。

现在，`FileSplitter`提供了一个`firstLineAsHeader`选项，可以将第一行内容作为消息头，发送给其余的行。

有关更多信息，请参见[文件支持](./file.html#files)。

##### FTP 和 SFTP 更改

入站通道适配器现在具有一个名为`max-fetch-size`的属性，该属性用于在当前本地目录中没有文件时限制轮询期间获取的文件数量。默认情况下，它们还在`local-filter`中配置了`FileSystemPersistentAcceptOnceFileListFilter`。

还可以通过设置新引入的`scanner`属性，为入站通道适配器提供自定义`DirectoryScanner`实现。

现在，你可以将正则表达式和模式筛选器配置为始终传递目录。当你在出站网关中使用递归时，这可能是有用的。

默认情况下，所有入站通道适配器（基于流和同步）现在都使用适当的`AbstractPersistentAcceptOnceFileListFilter`实现，以防止远程文件的重复下载。

FTP 和 SFTP 出站网关现在在获取远程文件时支持`REPLACE_IF_MODIFIED``FileExistsMode`。

FTP 和 SFTP 流入站通道适配器现在在消息头中添加远程文件信息。

FTP 和 SFTP 出站通道适配器（以及用于出站网关的`PUT`命令）现在也支持`InputStream`as`payload`。

入站通道适配器现在可以通过使用新引入的`RecursiveDirectoryScanner`在本地构建文件树。有关注入，请参见[FTP 入站通道适配器](./ftp.html#ftp-inbound)部分中的`scanner`选项。另外，你现在可以将这些适配器切换到`WatchService`。

我们将`NLST`命令添加到`AbstractRemoteFileOutboundGateway`命令中，以执行 List Files Names Remote 命令。

现在可以使用`FtpOutboundGateway`和`workingDirExpression`来更改当前请求消息的 FTP 客户机工作目录。

现在为`RemoteFileTemplate`提供了`invoke(OperationsCallback<F, T> action)`，以便在相同的、以线程为边界的`RemoteFileOperations`范围内执行多个`RemoteFileOperations`调用。

我们添加了新的过滤器来检测不完整的远程文件。

`FtpOutboundGateway`和`SftpOutboundGateway`现在支持使用`GET`或`MGET`命令在成功传输后删除远程文件的选项。

有关更多信息，请参见[FTP/FTPS 适配器](./ftp.html#ftp)和[SFTP 适配器](./sftp.html#sftp)。

##### 积分属性

版本 4.3.2 添加了一个新的`spring.integration.readOnly.headers`全局属性，使你可以自定义不应该由`MessageBuilder`复制到新创建的`Message`的标题列表。有关更多信息，请参见[全局属性](./configuration.html#global-properties)。

##### 流变化

我们在`CharacterStreamReadingMessageSource`上添加了一个新选项，以使其用于“pipe”stdin，并在管道关闭时发布应用程序事件。有关更多信息，请参见[从流中阅读](./stream.html#stream-reading)。

##### 障碍变化

`BarrierMessageHandler`现在支持一个丢弃通道，可以将延迟到达的触发消息发送到该通道。有关更多信息，请参见[螺纹屏障](./barrier.html#barrier)。

##### AMQP 变化

AMQP 出站端点现在支持在使用 RabbitMQ 延迟消息交换插件时设置延迟表达式。

入站端点现在支持 Spring AMQP`DirectMessageListenerContainer`。

支持 AMQP 的 Poller 通道现在为 Poller 配置的`receiveTimeout`（缺省：一秒）阻止 Poller 线程。

消息转换器添加到消息属性中的标题（例如`contentType`）现在在最终消息中使用。在此之前，它依赖于转换器类型，即最终消息中出现了哪些标头和消息属性。要覆盖转换器设置的标题，请将`headersMappedLast`属性设置为`true`。有关更多信息，请参见[AMQP 支持](./amqp.html#amqp)。

##### http 更改

默认情况下，`DefaultHttpHeaderMapper.userDefinedHeaderPrefix`属性现在是一个空字符串，而不是`X-`。有关更多信息，请参见[HTTP 头映射](./http.html#http-header-mapping)。

默认情况下，`uriVariablesExpression`现在使用`SimpleEvaluationContext`（自 5.0.4 起）。

有关更多信息，请参见[映射 URI 变量](./http.html#mapping-uri-variables)。

##### MQTT 变化

入站消息现在被映射为`RECEIVED_TOPIC`、`RECEIVED_QOS`和`RECEIVED_RETAINED`头，以避免在应用程序中继消息时无意中传播到出站消息。

出站通道适配器现在支持主题、QoS 和保留属性的表达式。默认值保持不变。有关更多信息，请参见[MQTT 支持](./mqtt.html#mqtt)。

##### stomp 变化

基于项目反应器`3.1`和`reactor-netty`扩展，我们将 Stomp 模块改为使用`ReactorNettyTcpStompClient`。根据`ReactorNettyTcpStompClient`基础，我们将`Reactor2TcpStompSessionManager`重命名为`ReactorNettyTcpStompSessionManager`。有关更多信息，请参见[Stomp 支持](./stomp.html#stomp)。

##### Web 服务变更

现在可以使用外部配置的`WebServiceTemplate`实例来提供`WebServiceOutboundGateway`实例。

`DefaultSoapHeaderMapper`现在可以将`javax.xml.transform.Source`用户定义的标头映射到一个 SOAP 标头元素。

简单的 WebService 入站和出站网关现在可以将完整的`WebServiceMessage`处理为`payload`，从而允许对 MTOM 附件进行操作。

有关更多信息，请参见[Web 服务支持](./ws.html#ws)。

##### Redis 变更

现在为`RedisStoreWritingMessageHandler`提供了额外的用于 SPEL 表达式的基于`String`的 setter（为了方便 Java 配置）。你现在也可以在`RedisStoreWritingMessageHandler`上配置`zsetIncrementExpression`。此外，由于`ZADD`Redis 命令上的`INCR`选项是可选的，因此此属性已从`true`更改为`false`。

你现在可以为`RedisInboundChannelAdapter`提供用于执行 Redis 侦听器调用程序的`Executor`。此外，接收到的消息现在包含一个`RedisHeaders.MESSAGE_SOURCE`头，以指示消息的来源（主题或模式）。

有关更多信息，请参见[Redis 支持](./redis.html#redis)。

##### TCP 更改

我们添加了一个新的`ThreadAffinityClientConnectionFactory`来将 TCP 连接绑定到线程。

现在，你可以将 TCP 连接工厂配置为支持`PushbackInputStream`实例，让反序列化器在“reading ahead”之后“unread”（后推）字节。

我们添加了不带`maxMessageSize`的`ByteArrayElasticRawDeserializer`，以根据需要控制和缓冲传入数据。

有关更多信息，请参见[TCP 和 UDP 支持](./ip.html#ip)。

##### Gemfire 变化

`GemfireMetadataStore`现在实现`ListenableMetadataStore`，通过向存储提供`MetadataStoreListener`实例，让你监听缓存事件。有关更多信息，请参见[Pivotal Gemfire 和 Apache Geode 支持](./gemfire.html#gemfire)。

##### JDBC 更改

`JdbcMessageChannelStore`现在提供了`ChannelMessageStorePreparedStatementSetter`的 setter，允许你在存储中自定义消息插入。

`ExpressionEvaluatingSqlParameterSourceFactory`现在提供了`sqlParameterTypes`的 setter，允许你定制参数的 SQL 类型。

有关更多信息，请参见[JDBC 支持](./jdbc.html#jdbc)。

##### 指标变化

[Micrometer](https://micrometer.io/)现在支持应用程序监视（自版本 5.0.2 起）。有关更多信息，请参见[千分尺积分](./metrics.html#micrometer-integration)。

|   |在版本 5.0.3 中对千分尺`Meters`进行了更改，以使其更适合在多维系统中使用。<br/>在 5.0.4 中进行了进一步的更改。<br/>如果你使用千分尺，我们建议至少使用版本 5.0.4。|
|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

##### `@EndpointId`注释

在版本 5.0.4 中引入了此注释，当你使用 Java 配置时，此注释提供了对 Bean 命名的控制。有关更多信息，请参见[Endpoint Bean Names](./overview.html#endpoint-bean-names)。

### 4.2 与 4.3 之间的变化

有关可能影响应用程序的重要更改，请参见[迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-4.2-to-4.3-Migration-Guide)。你可以在[Wiki](https://github.com/spring-projects/spring-integration/wiki)上找到所有回到 2.1 版本的迁移指南。

#### 新组件

版本 4.3 增加了一些新的组件。

##### AMQP 异步出站网关

见[异步出站网关](./amqp.html#amqp-async-outbound-gateway)。

##### `MessageGroupFactory`

我们引入了`MessageGroupFactory`策略，以允许在`MessageGroupStore`逻辑中控制`MessageGroup`实例。我们为`SimpleMessageGroup`添加了`SimpleMessageGroupFactory`实现，并将`GroupType.HASH_SET`作为标准`MessageGroupStore`实现的默认工厂。有关更多信息，请参见[消息存储](./message-store.html#message-store)。

##### `PersistentMessageGroup`

我们为持久的`getMessageGroup()`实例添加了`PersistentMessageGroup`（lazy-load proxy）实现，当`getMessageGroup()`的`lazyLoadMessageGroups`是`true`（默认）时，它为`getMessageGroup()`实例返回这个实例。有关更多信息，请参见[消息存储](./message-store.html#message-store)。

##### FTP 和 SFTP 流入站通道适配器

我们添加了入站通道适配器，这些适配器为每个文件返回`InputStream`，这样你就可以检索远程文件，而无需将它们写入本地文件系统。有关更多信息，请参见[FTP 流入站通道适配器](./ftp.html#ftp-streaming)和[SFTP 流入站通道适配器](./sftp.html#sftp-streaming)。

##### `StreamTransformer`

我们添加了`StreamTransformer`来将`InputStream`有效载荷转换为`byte[]`或`String`。有关更多信息，请参见[流变压器](./transformer.html#stream-transformer)。

##### 积分图

我们添加了`IntegrationGraphServer`，以及`IntegrationGraphController`REST 服务，以将 Spring 集成应用程序的运行时模型公开为一个图。有关更多信息，请参见[积分图](./graph.html#integration-graph)。

##### JDBC 锁定注册表

对于通过数据库表共享的分布式锁，我们添加了`JdbcLockRegistry`。有关更多信息，请参见[JDBC 锁定注册表](./jdbc.html#jdbc-lock-registry)。

##### `LeaderInitiator`表示`LockRegistry`

我们添加了基于`LockRegistry`策略的`LeaderInitiator`实现。有关更多信息，请参见[领导事件处理](./endpoint.html#leadership-event-handling)。

#### 一般变化

本节描述了版本 4.3 为 Spring 集成带来的一般更改。

##### 核心变化

本节描述对 Spring 集成的核心的一般更改。

###### 链中的出站网关

以前，你可以在链中的出站网关上指定`reply-channel`。它被完全忽视了。网关的回复将发送到下一个链元素，或者，如果网关是最后一个元素，则发送到链的输出通道。这种情况现在已被发现并被禁止。如果你有这样的配置，请删除`reply-channel`。

###### 异步服务激活器

我们添加了一个选项，使服务激活器是同步的。有关更多信息，请参见[异步服务激活器](./service-activator.html#async-service-activator)。

###### 消息传递注释支持更改

消息传递注释支持在类级别上不需要`@MessageEndpoint`（或任何其他`@Component`）注释声明。要恢复以前的行为，请将`spring.integration.properties`的`spring.integration.messagingAnnotations.require.componentAnnotation`设置为`true`。有关更多信息，请参见[全局属性](./configuration.html#global-properties)和[注释支持](./configuration.html#annotations)。

##### 邮件更改

本节描述对 Spring 集成邮件功能的一般更改。

###### 可定制用户标志

可定制的`userFlag`（在 4.2.2 中添加，以提供用于表示已看到邮件的标志的定制）现在在 XML 命名空间中可用。有关更多信息，请参见[不支持`\Recent`时标记 IMAP 消息]。

###### 邮件消息映射

现在，你可以使用包含邮件头和包含电子邮件内容的有效负载的`MessageHeaders`映射入站邮件。以前，有效载荷总是 RAW`MimeMessage`。有关更多信息，请参见[入站邮件消息映射](./mail.html#mail-mapping)。

##### JMS 更改

本节描述对 Spring 集成 JMS 功能的一般更改。

###### Header Mapper

现在，`DefaultJmsHeaderMapper`通过调用其`toString()`方法，将标准`correlationId`标头映射为消息属性。有关更多信息，请参见[映射消息头到和来自 JMS 消息](./jms.html#jms-header-mapping)。

###### 异步网关

JMS 出站网关现在具有`async`属性。有关更多信息，请参见[异步网关](./jms.html#jms-async-gateway)。

##### 聚合器更改

当 POJO 聚合器释放`Message<?>`对象的集合时，行为会发生变化。这是很少见的，但是，如果你的应用程序做到了这一点，你需要对 POJO 进行一个小的更改。有关更多信息，请参见[重要信息：`SimpleMessageGroup.getMessages()`方法返回`unmodifiableCollection`。]（./AGGregator.html#agg-message-collection）注释。

##### TCP/UDP 更改

本节描述对 Spring 集成 TCP/UDP 功能的一般更改。

###### 事件

在启动服务器连接工厂时，将发出一个新的`TcpConnectionServerListeningEvent`。有关更多信息，请参见[TCP 连接事件](./ip.html#tcp-events)。

现在可以在`<int-ip:udp-outbound-channel-adapter>`上使用`destination-expression`和`socket-expression`属性。有关更多信息，请参见[UDP 适配器](./ip.html#udp-adapters)。

###### 流反序列化器

各种反序列化器在组装完整个消息之前不能分配最终的缓冲区，现在它们支持池合并接收数据的原始缓冲区，而不是为每个消息创建和丢弃缓冲区。有关更多信息，请参见[TCP 连接工厂](./ip.html#tcp-connection-factories)。

###### TCP 消息映射器

消息映射器现在可选地设置一个已配置的内容类型标头。有关更多信息，请参见[IP 消息头](./ip.html#ip-msg-headers)。

##### 文件更改

本节描述对 Spring 集成文件功能的一般更改。

###### 目标目录创建

为`FileWritingMessageHandler`生成的文件名可以表示为目标目录中的文件保存所需的目录结构的子路径。有关更多信息，请参见[生成文件名](./file.html#file-writing-file-names)。

`FileReadingMessageSource`现在隐藏了内部类中的`WatchService`目录扫描逻辑。我们添加了`use-watch-service`和`watch-events`选项来启用此行为。由于 API 的不一致性，我们不推荐顶级`WatchServiceDirectoryScanner`。有关更多信息，请参见[`WatchServiceDirectoryScanner`]（./file.html#watch-service-directory-scanner）。

###### 缓冲区大小

写文件时，现在可以指定缓冲区大小。

###### 追加和刷新

现在，你可以避免在追加文件时刷新文件，并在空闲期间使用许多策略来刷新数据。有关更多信息，请参见[在使用`APPEND_NO_FLUSH`时刷新文件]。

###### 保存时间戳

现在可以配置出站通道适配器来设置目标文件的`lastmodified`时间戳。有关更多信息，请参见[文件时间戳](./file.html#file-timestamps)。

###### 拆分器更改

现在，当文件被完全读取时，`FileSplitter`会自动关闭一个 FTP 或 SFTP会话。当出站网关返回`InputStream`或者当你使用新的 FTP 或 SFTP 流媒体通道适配器时，这一点将得到应用。我们还引入了一个新的`markers-json`选项，将`FileSplitter.FileMarker`转换为 JSON`String`，以进行放松的下游网络交互。有关更多信息，请参见[文件拆分器](./file.html#file-splitter)。

###### 文件过滤器

我们添加了`ChainFileListFilter`作为`CompositeFileListFilter`的替代方案。有关更多信息，请参见[读取文件](./file.html#file-reading)。

##### AMQP 变化

本节描述对 Spring 集成 AMQP 功能的一般更改。

###### 内容类型消息转换器

出站端点现在支持配置为`RabbitTemplate`的`ContentTypeDelegatingMessageConverter`，这样你就可以根据消息内容类型选择转换器。有关更多信息，请参见[出站消息转换](./amqp.html#content-type-conversion-outbound)。

###### 用于延迟消息处理的头

Spring AMQP1.6 增加了对[延迟的消息交换](https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq/)的支持。头映射现在支持此功能使用的头（`amqp_delay`和`amqp_receivedDelay`）。

###### AMQP 支持的通道

AMQP 支持的通道现在支持消息映射。有关更多信息，请参见[AMQP 支持的消息通道](./amqp.html#amqp-channels)。

##### Redis 变更

本节描述对 Spring 集成 Redis 功能的一般更改。

###### 列表推送/弹出方向

以前，队列通道适配器总是在固定的方向上使用 Redis 列表，将其推到左端并从右端读取。现在，你可以分别使用`rightPop`和`leftPush`选项来配置读写方向和`RedisQueueMessageDrivenEndpoint`选项。有关更多信息，请参见[Redis 队列入站通道适配器](./redis.html#redis-queue-inbound-channel-adapter)和[Redis 队列出站通道适配器](./redis.html#redis-queue-outbound-channel-adapter)。

###### 队列入站网关默认序列化器

为了与出站网关兼容，入站网关中的默认序列化器已更改为`JdkSerializationRedisSerializer`。有关更多信息，请参见[Redis 队列入站网关](./redis.html#redis-queue-inbound-gateway)。

##### http 更改

在此之前，如果请求的主体（如`POST`）中没有`content-type`头，则主体将被忽略。在此版本中，此类请求的内容类型被认为是 RFC2616 推荐的`application/octet-stream`。有关更多信息，请参见[HTTP 入站组件](./http.html#http-inbound)。

`uriVariablesExpression`现在默认使用`SimpleEvaluationContext`（自 4.3.15 起）。有关更多信息，请参见[映射 URI 变量](./http.html#mapping-uri-variables)。

##### SFTP 更改

本节描述对 Spring Integration SFTP 功能的一般更改。

###### 工厂 Bean

我们添加了一个新的工厂 Bean，以简化 SFTP 的 JSCH 代理的配置。有关更多信息，请参见[Proxy Factory Bean](./sftp.html#sftp-proxy-factory-bean)。

###### `chmod`变更

SFTP 出站网关（用于`put`和`mput`命令）和 SFTP 出站通道适配器现在支持`chmod`属性，以在上传后更改远程文件权限。有关更多信息，请参见`[SFTP Outbound Channel Adapter](./sftp.html#sftp-outbound)`和`[SFTP Outbound Gateway](./sftp.html#sftp-outbound-gateway)`。

##### FTP 更改

本节描述对 Spring 集成 FTP 功能的一般更改。

###### 会话变化

`FtpSession`现在支持`null`和`listNames()`方法的`null`，因为底层的 FTP 客户机可以使用它。这样，你就可以在不使用`remoteDirectory`表达式的情况下配置`FtpOutboundGateway`表达式。你也可以配置`<int-ftp:inbound-channel-adapter>`而不使用`remote-directory`或`remote-directory-expression`。有关更多信息，请参见[FTP/FTPS 适配器](./ftp.html#ftp)。

##### 路由器变更

`ErrorMessageExceptionTypeRouter`现在支持`Exception`超类映射，以避免在存在多个继承者的情况下对相同通道进行重复。为此，`ErrorMessageExceptionTypeRouter`在初始化`ClassNotFoundException`的 fail-fast 期间加载映射类。

有关更多信息，请参见[Routers](./router.html#router)。

##### 标头映射

本节描述了在版本 4.2 和 4.3 之间对头映射的更改。

###### 一般

AMQP、WS 和 XMPP 头映射（例如`request-header-mapping`和`reply-header-mapping`）现在支持否定模式。有关更多信息，请参见[AMQP 消息头](./amqp.html#amqp-message-headers)，[WS 消息头](./ws.html#ws-message-headers)和[XMPP 消息头](./xmpp.html#xmpp-message-headers)。

###### AMQP 头映射

以前，默认情况下只对标准的 AMQP 头进行映射。你必须显式地启用用户定义标头的映射。在这个版本中，默认情况下所有的头都是映射的。此外，入站`amqp_deliveryMode`头在默认情况下不再映射。有关更多信息，请参见[AMQP 消息头](./amqp.html#amqp-message-headers)。

##### Groovy 脚本

现在可以使用`compile-static`提示或任何其他`CompilerConfiguration`选项配置 Groovy 脚本。有关更多信息，请参见[Groovy 配置](./groovy.html#groovy-config)。

##### `@InboundChannelAdapter`变化

`@InboundChannelAdapter`现在为常规的`value`提供了一个别名`channel`属性。此外，目标`SourcePollingChannelAdapter`组件现在可以从其提供的名称（`outputChannel` Bean 选项）以后期绑定的方式解析目标`outputChannelName`。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

##### XMPP 更改

XMPP 通道适配器现在支持 XMPP 扩展。有关更多信息，请参见[XMPP 扩展](./xmpp.html#xmpp-extensions)。

##### 窃听延迟绑定

`WireTap``ChannelInterceptor`现在可以接受一个`channelName`，它将在以后的第一次活动拦截器操作期间解析为目标`MessageChannel`。有关更多信息，请参见[Wire Tap](./channel.html#channel-wiretap)。

##### `ChannelMessageStoreQueryProvider`变化

`ChannelMessageStoreQueryProvider`现在支持 H2 数据库。有关更多信息，请参见[支持消息通道](./jdbc.html#jdbc-message-store-channels)。

#####  WebSocket 变化

`ServerWebSocketContainer`现在公开一个`allowedOrigins`选项，`SockJsServiceOptions`公开一个`suppressCors`选项。有关更多信息，请参见[WebSockets 支持](./web-sockets.html#web-sockets)。

### 4.1 和 4.2 之间的变化

有关可能影响应用程序的重要更改，请参见[迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-4.1-to-4.2-Migration-Guide)。你可以在[wiki](https://github.com/spring-projects/spring-integration/wiki)上找到所有回到 2.1 版本的迁移指南。

#### 新组件

版本 4.2 增加了一些新的组件。

##### 主要管理/JMX 返工

我们添加了一个新的`MetricsFactory`策略界面。这一变化以及 JMX 和管理基础设施中的其他变化，为管理配置和运行时性能提供了更多的控制。

然而，这对（某些）用户环境有一些重要的影响。

有关完整的详细信息，请参见[度量和管理](./metrics.html#metrics-management)和[JMX 改进](./jmx.html#jmx-42-improvements)。

##### MongoDB 元数据存储

`MongoDbMetadataStore`现在可用。有关更多信息，请参见[MongoDB 元数据存储](./mongodb.html#mongodb-metadata-store)。

##### 安全通道注释

我们引入了`@SecuredChannel`注释，替换了不推荐的`ChannelSecurityInterceptorFactoryBean`。有关更多信息，请参见[Security in Spring Integration](./security.html#security)。

##### `SecurityContext`传播

我们为从一个消息流的线程传播到另一个消息流的`SecurityContext`引入了`SecurityContextPropagationChannelInterceptor`。有关更多信息，请参见[Security in Spring Integration](./security.html#security)。

##### 文件夹

在 4.1.2 中，我们添加了`FileSplitter`，它将文本文件分割成行。它现在在`int-file:`命名空间中获得了完全支持。有关更多信息，请参见[文件拆分器](./file.html#file-splitter)。

##### 动物园管理员支持

我们在框架中添加了 ZooKeeper 支持，以在集群或多主机环境中运行时提供帮助。这一变化影响到以下特征：

* `ZookeeperMetadataStore`

* `ZookeeperLockRegistry`

* 动物园管理员领导

有关更多信息，请参见[动物园管理员支持](./zookeeper.html#zookeeper)。

##### 螺纹屏障

一个新的线程`<int:barrier/>`组件是可用的，它允许一个线程被挂起，直到某个异步事件发生。有关更多信息，请参见[螺纹屏障](./barrier.html#barrier)。

##### stomp 支持

我们将 STOMP 支持添加到框架中，作为入站和出站通道适配器对。有关更多信息，请参见[Stomp 支持](./stomp.html#stomp)。

##### 编解码器

引入了一个新的`Codec`抽象，用于对`Codec`之间的对象进行编码和解码。我们添加了一个使用 Kryo 的实现。我们还添加了基于编解码的变压器和消息转换器。有关更多信息，请参见[Codec](./codec.html#codec)。

##### 消息 PreparedStatement setter

一个新的`MessagePreparedStatementSetter`函数接口回调可用于`JdbcMessageHandler`（`<int-jdbc:outbound-gateway>`和`<int-jdbc:outbound-channel-adapter>`），作为使用`SqlParameterSourceFactory`填充`PreparedStatement`上下文上的参数的一种替代方法。有关更多信息，请参见[出站通道适配器](./jdbc.html#jdbc-outbound-channel-adapter)。

#### 一般变动

本部分描述了从版本 4.1 到版本 4.2 的一般更改。

##### 窃听

作为现有`selector`属性的替代选项，`<wire-tap/>`元素现在支持`selector-expression`属性。

##### 文件更改

有关这些更改的更多信息，请参见[文件支持](./file.html#files)。

###### 追加新行

`<int-file:outbound-channel-adapter>`和`<int-file:outbound-gateway>`现在支持`append-new-line`属性。如果设置为`true`，则在写入消息后会在文件中添加新的行。默认属性值是`false`。

###### 忽略隐藏文件

我们为`<int-file:inbound-channel-adapter>`添加了`ignore-hidden`属性，使你可以设置是否从源目录中获取隐藏的文件。它默认为`true`。

###### 写入`InputStream`有效载荷

`FileWritingMessageHandler`现在也接受`InputStream`作为有效的消息有效负载类型。

###### `HeadDirectoryScanner`

你现在可以将`HeadDirectoryScanner`与其他`FileListFilter`实现一起使用。

###### 上次修改的过滤器

我们添加了`LastModifiedFileListFilter`。

###### 手表服务目录扫描仪

我们添加了`WatchServiceDirectoryScanner`。

###### 持久文件列表过滤器更改

`AbstractPersistentFileListFilter`具有一个新属性（`flushOnUpdate`），当将其设置为`true`时，如果实现`Flushable`（例如，`PropertiesPersistingMetadataStore`），则在元数据存储上调用`flush()`。

##### 类包更改

我们将`org.springframework.integration.scattergather`类从`org.springframework.integration.handler`移到了`org.springframework.integration.scattergather`。

##### TCP 更改

本节描述对 Spring Integration TCP 功能的一般更改。

###### TCP 序列化器

tcp`Serializers`不再`flush()``OutputStream`。现在这是由`TcpNxxConnection`类完成的。如果直接在代码中使用序列化器，则可能需要`flush()``OutputStream`。

###### 服务器套接字异常

`TcpConnectionServerExceptionEvent`现在，每当 TCP 服务器套接字上发生意外异常时，都会发布实例（也添加到 4.1.3 和 4.0.7 中）。有关更多信息，请参见[TCP 连接事件](./ip.html#tcp-events)。

###### TCP 服务器端口

如果将 TCP 服务器套接字工厂配置为侦听随机端口，那么现在可以通过使用`getPort()`获得 OS 选择的实际端口。`getServerSocketAddress()`也是可用的。

有关更多信息，请参见“[TCP 连接工厂](./ip.html#tcp-connection-factories)”。

###### TCP 网关远程超时

`TcpOutboundGateway`现在支持`remote-timeout-expression`作为现有`remote-timeout`属性的替代选项。这允许根据每条消息设置超时。

此外，`remote-timeout`不再默认为与`reply-timeout`相同的值，这具有完全不同的含义。

有关更多信息，请参见[.TCP 出站网关属性](./ip.html#tcp-ob-gateway-attributes)。

###### TCP SSLSession 可用于头映射

`TcpConnection`实现现在支持`getSslSession()`，让你从会话中提取信息以添加到消息头中。有关更多信息，请参见`null`。

###### TCP 事件

现在，每当出现关联异常时，就会发布新的事件——例如向不存在的套接字发送消息。

`TcpConnectionEventListeningMessageProducer`不受欢迎。使用泛型事件适配器。

有关更多信息，请参见[TCP 连接事件](./ip.html#tcp-events)。

##### `@InboundChannelAdapter`变更

以前，入站通道适配器上的`@Poller`将`TcpNxxConnection`属性默认为`-1`（无穷大）。这与`<inbound-channel-adapter/>`的 XML 配置不一致，后者缺省为`1`。注解现在默认此属性为`1`。

##### API 更改

`o.s.integration.util.FunctionIterator`现在需要一个`o.s.integration.util.Function`，而不是一个`reactor.function.Function`。这样做是为了消除对反应堆不必要的硬性依赖。这个迭代器的任何使用都需要更改导入。

对于`Promise`网关等功能，仍然支持 Reactor。对于那些不需要该依赖项的用户，该依赖项已被删除。

##### JMS 更改

本节描述对 Spring Integration TCP 功能的一般更改。

###### 回复侦听器惰性初始化

现在，你可以将 JMS 出站网关中的应答侦听器配置为按需初始化，并在空闲一段时间后停止，而不是由网关的生命周期来控制。有关更多信息，请参见[出站网关](./jms.html#jms-outbound-gateway)。

###### 消息驱动端点中的转换错误

`error-channel`现在用于转换错误。在以前的版本中，它们会导致事务回滚和消息重新交付。

有关更多信息，请参见[消息驱动通道适配器](./jms.html#jms-message-driven-channel-adapter)和`confirm-ack-channel`。

###### 默认确认模式

当使用隐式定义的`DefaultMessageListenerContainer`时，默认的`acknowledge`现在是`transacted`。我们建议在使用此容器时使用`transacted`，以避免消息丢失。这个默认值现在应用于消息驱动的入站适配器和入站网关。它已经是 JMS 支持的通道的默认设置。

有关更多信息，请参见[消息驱动通道适配器](./jms.html#jms-message-driven-channel-adapter)和。

###### `@EnableIntegration`共享订阅

我们向消息驱动的端点和`<int-jms:publish-subscribe-channel>`添加了对共享订阅（JMS2.0）的命名空间支持。以前，你必须将侦听器容器连接为`<bean/>`声明，以使用共享连接。

有关更多信息，请参见`default-reply-to`。

##### 条件 Pollers

现在，我们为动态轮询提供了更大的灵活性。

有关更多信息，请参见[消息源的条件 Poller](./polling-consumer.html#conditional-pollers)。

##### AMQP 变化

本节描述 Spring 集成 AMQP 功能的一般更改。

###### 发布者确认

`<int-amqp:outbound-gateway>`现在支持`confirm-correlation-expression`、`confirm-ack-channel`和`confirm-nack-channel`属性（其目的类似于`<int-amqp:outbound-channel-adapter>`）。

###### 相关数据

对于出站通道适配器和入站网关，如果相关数据是`Message<?>`，则它将成为 ACK 或 NACK 通道上消息的基础，并添加额外的头。以前，任何相关数据（包括`Message<?>`）都作为 ACK 或 NACK 消息的有效负载返回。

###### 入站网关属性

`<int-amqp:inbound-gateway>`现在公开`amqp-template`属性，以允许对外部 Bean 的答复`o.s.integration.util.Function`进行更多控制。你还可以提供自己的`AmqpTemplate`实现。此外，如果请求消息没有`replyTo`属性，则可以使用`default-reply-to`。

有关更多信息，请参见[AMQP 支持](./amqp.html#amqp)。

##### XPath 拆分器改进

现在，`XPathMessageSplitter`（`<int-xml:xpath-splitter>`）允许为内部`output-properties`配置`output-properties`，并支持用于 XPath 评估`Iterator`结果的`true`模式（默认为`true`）。

有关更多信息，请参见[分割 XML 消息](./xml.html#xml-xpath-splitting)。

##### http 更改

本节描述对 Spring 集成 HTTP 功能的一般更改。

###### CORS

HTTP 入站端点（`<int-http:inbound-channel-adapter>`和`<int-http:inbound-gateway>`）现在允许跨源资源共享的配置。

有关更多信息，请参见[跨源资源共享支持](./http.html#http-cors)。

###### 入站网关超时

你可以将 HTTP 入站门方式配置为在请求超时时返回指定的状态码。现在的默认值是`500 Internal Server Error`，而不是`200 OK`。

有关更多信息，请参见[响应状态代码](./http.html#http-response-statuscode)。

###### 表单数据

我们添加了代理`multipart/form-data`请求的文档。有关更多信息，请参见[HTTP 支持](./http.html#http)。

##### 网关更改

本节描述对 Spring 集成网关功能的一般更改。

###### 网关方法可以返回`CompletableFuture<?>`

当使用 Java8 时，网关方法现在可以返回`CompletableFuture<?>`。有关更多信息，请参见[`CompletableFuture`]（./gateway.html#gw-completable-future）。

###### MessagingGateway 注释

请求和回复超时属性现在是，而不是`Long`，以允许使用属性占位符或 SPEL 进行配置。参见[`@MessagingGateway`注释]。

##### 聚合器更改

本节描述对 Spring 集成聚合器功能的一般更改。

###### 聚合器性能

该版本通过在发布组消息时更有效地从组中删除消息，对聚合组件（聚合器、重排序程序和其他组件）进行了一些性能改进。新的方法（`removeMessagesFromGroup`）已添加到消息存储中。设置`removeBatchSize`属性（默认：`CompletableFuture<?>`）以调整每个操作中删除的消息数量。目前，JDBC、Redis 和 MongoDB 消息存储支持此属性。

###### 输出消息组处理器

当使用`ref`或 inner Bean 作为聚合器时，现在可以直接绑定`MessageGroupProcessor`。此外，我们还添加了一个`SimpleMessageGroupProcessor`，它传回组中的消息集合。当输出处理器生成`@MessagingGateway`的集合时，聚合器将单独释放这些消息。配置`SimpleMessageGroupProcessor`会使聚合器成为消息屏障，在这里，消息会一直保留到所有消息到达，然后单独发布。有关更多信息，请参见[Aggregator](./aggregator.html#aggregator)。

##### FTP 和 SFTP 更改

本节描述对 Spring 集成 FTP 和 SFTP 功能的一般更改。

###### 入站通道适配器

现在可以在入站通道适配器上指定`remote-directory-expression`，以在运行时确定目录。有关更多信息，请参见[FTP/FTPS 适配器](./ftp.html#ftp)和[SFTP 适配器](./sftp.html#sftp)。

###### 网关部分结果

当你使用 FTP 或 SFTP 出站网关对多个文件（使用`mget`和`mput`）进行操作时，在部分请求完成后可能会发生异常。如果出现这样的条件，将抛出一个包含部分结果的`PartialSuccessException`。有关更多信息，请参见[FTP 出站网关](./ftp.html#ftp-outbound-gateway)和[SFTP 出站网关](./sftp.html#sftp-outbound-gateway)。

###### 委托会话工厂

我们添加了一个委托会话工厂，允许基于某些线程上下文值来选择特定的会话工厂。

有关更多信息，请参见[Delegating Session Factory](./ftp.html#ftp-dsf)和[Delegating Session Factory](./sftp.html#sftp-dsf)。

###### 默认 SFTP会话工厂

以前，`DefaultSftpSessionFactory`无条件地允许与未知主机的连接。这现在是可配置的（默认值：`false`）。

工厂现在需要一个已配置的`knownHosts`，文件，除非`allowUnknownKeys`属性是`true`（默认：`false`）。

有关更多信息，请参见[`allowUnknownKeys`::设置为`true`以允许使用未知（或更改）密钥的主机连接。]。

###### 消息会话回调

我们引入了`MessageSessionCallback<F, T>`以在`<int-(s)ftp:outbound-gateway/>`中使用`requestMessage`上下文执行任何自定义`Session`操作。

有关更多信息，请参见[使用`MessageSessionCallback`]（./ftp.html#ftp-会话-callback）和[MessagesessionCallback](./sftp.html#sftp-session-callback)。

#####  WebSocket 变化

我们在`WebSocketHandlerDecoratorFactory`中添加了`ServerWebSocketContainer`支持，以允许对内部`WebSocketHandler`进行链式定制。有关更多信息，请参见[WebSockets 名称空间支持](./web-sockets.html#web-sockets-namespace)。

##### 应用程序事件适配器更改

`ApplicationEvent`适配器现在可以使用`payload`作为`event`来操作，从而直接允许省略自定义`ApplicationEvent`扩展。为此，我们在`<int-event:outbound-channel-adapter>`上引入了`publish-payload`布尔属性。有关更多信息，请参见[ Spring `ApplicationEvent`支持]。

### 4.0 和 4.1 之间的变化

有关可能影响应用程序的重要更改，请参见[迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-4.0-to-4.1-Migration-Guide)。你可以在[wiki](https://github.com/spring-projects/spring-integration/wiki)上找到所有回到 2.1 版本的迁移指南。

#### 新组件

版本 4.1 增加了一些新的组件。

##### promise\<?\>gateway

消息传递网关方法现在支持 reactor`Promise`返回类型。见[异步网关](./gateway.html#async-gateway)。

#####  WebSocket 支持

`WebSocket`模块现已可用。它完全基于 Spring  WebSocket 和 Spring 消息传递模块，并提供了`<inbound-channel-adapter>`和`<outbound-channel-adapter>`。有关更多信息，请参见[WebSockets 支持](./web-sockets.html#web-sockets)。

##### 散集 Enterprise 集成模式

实现了散集 Enterprise 集成模式。有关更多信息，请参见[分散收集](./scatter-gather.html#scatter-gather)。

##### 布线滑移模式

我们添加了路由条 EIP 模式的实现。有关更多信息，请参见[布线滑移](./router.html#routing-slip)。

##### 幂等接收器模式

通过在 XML 中添加[布线滑移](./router.html#routing-slip)组件或在 Java 配置中添加`IdempotentReceiverInterceptor`和`IdempotentReceiver`注释，我们添加了幂等接收器 Enterprise 集成模式实现。有关更多信息，请参见`JsonObjectMapper`和[Javadoc](https://docs.spring.io/spring-integration/api/index.html)。

##### [布线滑移](./router.html#routing-slip)Boon`JsonObjectMapper`

我们为 JSON Transformers 添加了好处`JsonObjectMapper`。有关更多信息，请参见[变压器](./transformer.html#transformer)。

##### Redis 队列网关

我们添加了`<redis-queue-inbound-gateway>`和`<redis-queue-outbound-gateway>`组件。见[Redis 队列入站网关](./redis.html#redis-queue-inbound-gateway)和[Redis 队列出站网关](./redis.html#redis-queue-outbound-gateway)。

##### `PollSkipAdvice`

我们添加了`<advice-chain>`，你可以在`<poller>`的`<advice-chain>`中使用它来确定当前轮询是否应该被你用`PollSkipStrategy`实现的某些条件所抑制（跳过）。有关更多信息，请参见[Poller](./polling-consumer.html#polling-consumer)。

#### 一般变化

本节描述了从 4.0 到 4.1 版本的一般更改。

##### AMQP 入站端点，通道

使用消息侦听器容器（入站端点和通道）的元素现在支持`missing-queues-fatal`属性。有关更多信息，请参见[AMQP 支持](./amqp.html#amqp)。

##### AMQP 出站端点

AMQP 出站端点支持一个名为`lazy-connect`的新属性（默认：`true`）。当`true`时，直到第一条消息到达（假设没有入站端点，这些端点总是在启动过程中尝试建立连接），才会建立到代理的连接。当设置为[Poller](./polling-consumer.html#polling-consumer)时，将在应用程序启动期间尝试建立连接。有关更多信息，请参见[AMQP 支持](./amqp.html#amqp)。

##### SimpleMessageStore

在调用`getMessageGroup()`时，`SimpleMessageStore`不再复制该组。有关更多信息，请参见[[warning]（./message-store.html#sms-caution）。

##### Web 服务出站网关：`encode-uri`

`<ws:outbound-gateway/>`现在提供了一个`encode-uri`属性，允许在发送请求之前禁用 URI 对象的编码。

##### HTTP 入站通道适配器和状态代码

现在可以将`<http:inbound-channel-adapter>`配置为。

##### MQTT 适配器更改

现在，你可以将 MQTT 通道适配器配置为连接到多个服务器——例如，以支持高可用性。有关更多信息，请参见[MQTT 支持](./mqtt.html#mqtt)。

MQTT 消息驱动通道适配器现在支持为每个订阅指定 QoS 设置。有关更多信息，请参见[入站（消息驱动）通道适配器](./mqtt.html#mqtt-inbound)。

MQTT 出站通道适配器现在支持异步发送，在确认发送之前避免阻塞。有关更多信息，请参见[出站通道适配器](./mqtt.html#mqtt-outbound)。

现在可以在运行时以编程方式订阅和取消订阅主题。有关更多信息，请参见[入站（消息驱动）通道适配器](./mqtt.html#mqtt-inbound)。

##### FTP 和 SFTP 适配器更改

FTP 和 SFTP 出站通道适配器现在支持追加到远程文件，并在远程文件已经存在时采取特定的操作。远程文件模板现在也支持这一点，以及`rmdir()`和`exists()`。此外，远程文件模板提供了对底层客户机对象的访问，从而能够访问底层 API。

有关更多信息，请参见[FTP/FTPS 适配器](./ftp.html#ftp)和[SFTP 适配器](./sftp.html#sftp)。

##### 拆分器和迭代器

`Splitter`组件现在支持将`Iterator`作为生成输出消息的结果对象。有关更多信息，请参见[Splitter](./splitter.html#splitter)。

##### `allowUnknownKeys`聚合器

`Aggregator`Instancess 现在支持一个新属性`expire-groups-upon-timeout`。有关更多信息，请参见[Aggregator](./aggregator.html#aggregator)。

##### 内容更丰富的改进

我们添加了一个`null-result-expression`属性，如果`<enricher>`返回`null`，则对该属性进行求值并返回。你可以在`<header>`和`<property>`中添加它。有关更多信息，请参见[内容更丰富](./content-enrichment.html#content-enricher)。

我们添加了一个`error-channel`属性，如果`Exception`发生在`request-channel`的下游，该属性将用于处理错误流。这使你可以返回一个替代对象来用于充实。有关更多信息，请参见[内容更丰富](./content-enrichment.html#content-enricher)。

##### header 通道注册表

`<header-enricher/>`元素的`<header-channels-to-string/>`子元素现在可以重写 header 通道注册中心保留通道映射的默认时间。有关更多信息，请参见[报头通道注册表](./content-enrichment.html#header-channel-registry)。

##### 有序关机

我们对有序关机算法进行了改进。有关更多信息，请参见[有序关机](./shutdown.html#jmx-shutdown)。

##### `RecipientListRouter`的管理

`RecipientListRouter`现在提供了几个管理操作，以在运行时配置收件人。这样，你现在就可以配置`<recipient-list-router>`，而不需要从一开始就配置任何`<recipient>`。有关更多信息，请参见[`RecipientListRouterManagement`]。

##### AbstracTheAderMapper:非 \_Standard\_Headers 令牌

`AbstractHeaderMapper`实现现在提供了额外的`NON_STANDARD_HEADERS`令牌来映射任何用户定义的标头，这些标头在默认情况下是不映射的。有关更多信息，请参见[AMQP 消息头](./amqp.html#amqp-message-headers)。

##### AMQP 信道：`template-channel-transacted`

我们为 AMQP`MessageChannel`实例引入了`template-channel-transacted`属性。有关更多信息，请参见[AMQP 支持的消息通道](./amqp.html#amqp-channels)。

##### syslog 适配器

默认的 Syslog 消息转换器现在有一个选项，可以在设置消息头的同时保留有效负载中的原始消息。有关更多信息，请参见[Syslog 入站通道适配器](./syslog.html#syslog-inbound-adapter)。

##### 异步网关

除了`Promise`返回类型[前面提到过](#x4.1-promise-gateway)外，网关方法现在还可以返回`Promise`，这是 Spring Framework4.0 中介绍的。你还可以在网关中禁用异步处理，让下游流直接返回`Future`。见[异步网关](./gateway.html#async-gateway)。

##### 聚合器建议链

`Aggregator`和`Resequencer`现在支持`<expire-advice-chain/>`和`<expire-transactional/>`子元素来建议`forceComplete`操作。有关更多信息，请参见[使用 XML 配置聚合器](./aggregator.html#aggregator-xml)。

##### 出站通道适配器和脚本

[重测序器](./resequencer.html#resequencer)现在支持`<script/>`子元素。底层脚本必须具有`void`返回类型或`null`返回类型。见[Groovy 支持](./groovy.html#groovy)和[脚本支持](./scripting.html#scripting)。

##### 重测序器更改

当重排序程序中的消息组超时（使用`group-timeout`或`MessageGroupStoreReaper`）时，现在默认情况下，将立即丢弃延迟到达的消息。见[重测序器](./resequencer.html#resequencer)。

##### 可选 POJO 方法参数

Spring 集成现在一致地处理 Java8 的`Optional`类型。见[配置服务激活器](./service-activator.html#service-activator-namespace)。

##### `QueueChannel`backed 队列类型

支持`QueueChannel`的`Queue type`已从`BlockingQueue`更改为更通用的`Queue`。此更改允许使用任何外部`Queue`实现（例如，Reactor 的`PersistentQueue`）。参见[`QueueChannel`配置]。

##### `ChannelInterceptor`变化

`ChannelInterceptor`现在支持额外的`afterSendCompletion()`和`afterReceiveCompletion()`方法。见[出站通道适配器](./mqtt.html#mqtt-outbound)。

##### IMAP PEEK

从版本 4.1.1 开始，如果将`mail.[protocol].peek`JavaMail 属性显式地设置为`false`（其中`[protocol]`是`imap`或`imaps`），则行为会发生变化。参见[[重要]]。

### 3.0 和 4.0 之间的变化

有关可能影响应用程序的重要更改，请参见[迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-3.0-to-4.0-Migration-Guide)。你可以在[wiki](https://github.com/spring-projects/spring-integration/wiki)上找到所有回到 2.1 版本的迁移指南。

#### 新组件

4.0 版本增加了许多新的组件。

##### MQTT 通道适配器

MQTT 通道适配器（以前在 Spring 集成扩展存储库中可用）现在可以作为正常 Spring 集成分布的一部分使用。见[MQTT 支持](./mqtt.html#mqtt)。

##### `@EnableIntegration`

我们添加了`@EnableIntegration`注释，以允许在使用`@Configuration`类时声明标准 Spring 集成 bean。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

##### `@IntegrationComponentScan`

我们添加了`@IntegrationComponentScan`注释，以允许 Classpath 扫描 Spring 特定于集成的组件。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

##### “@enableMessageHistory”

现在可以在`@Configuration`类中使用`@EnableMessageHistory`注释来启用消息历史记录。此外，JMX MBean 还可以修改消息历史设置。此外，`MessageHistory`可以跟踪自动创建的带有注释的端点的`MessageHandler`实例（例如`@ServiceActivator`，`@Splitter`，以及其他）。有关更多信息，请参见[消息历史](./message-history.html#message-history)。

##### `@MessagingGateway`

现在可以使用`@MessagingGateway`注释配置消息传递网关接口。它类似于`<int:gateway/>`XML 元素。有关更多信息，请参见[`@MessagingGateway`注释]。

#####  Spring boot`@EnableAutoConfiguration`

除了前面提到的`@EnableIntegration`注释之外，我们还引入了一个钩子，允许 Spring 集成基础架构 bean 配置 Spring boot 的`@EnableAutoConfiguration`注释。有关更多信息，请参见 Spring 引导参考指南中的[“自动配置”](https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-auto-configuration.html)。

##### `@GlobalChannelInterceptor`

除了上面提到的`@EnableIntegration`注释之外，我们还引入了`@GlobalChannelInterceptor`注释。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

##### `@IntegrationConverter`

我们引入了`@IntegrationConverter`注释，作为`<int:converter/>`组件的类似物。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

##### `@EnablePublisher`

我们添加了`@EnablePublisher`注释，以便为`@Publisher`注释提供`default-publisher-channel`的规范。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

##### Redis Channel 消息存储

我们添加了一个 REDIS`MessageGroupStore`，该 REDIS 对支持`QueueChannel`以实现持久性进行了优化。有关更多信息，请参见[Redis Channel 消息存储](./redis.html#redis-cms)。

我们添加了一个 redis`ChannelPriorityMessageStore`。你可以使用它来按优先级检索消息。有关更多信息，请参见[Redis Channel 消息存储](./redis.html#redis-cms)。

##### MongodDB 频道消息存储

MongoDB 支持现在提供了`MongoDbChannelMessageStore`，这是一个特定于通道的`MessageStore`实现。使用`priorityEnabled = true`，你可以在`<int:priority-queue>`元素中使用它来实现持久消息的优先顺序轮询。有关更多信息，请参见[MongoDB 通道消息存储](./mongodb.html#mongodb-priority-channel-message-store)。

##### `@EnableIntegrationMBeanExport`

现在可以在`@Configuration`类中启用`IntegrationMBeanExporter`注释。有关更多信息，请参见[MBean 出口商](./jmx.html#jmx-mbean-exporter)。

##### `ChannelSecurityInterceptorFactoryBean`

`ChannelSecurityInterceptorFactoryBean`现在支持为使用`@Configuration`类的消息通道配置 Spring 安全性。有关更多信息，请参见[Security in Spring Integration](./security.html#security)。

##### Redis 命令网关

Redis 支持现在提供`<outbound-gateway>`组件，以通过使用`RedisConnection#execute`方法执行通用的 Redis 命令。有关更多信息，请参见[Redis 出站命令网关](./redis.html#redis-outbound-gateway)。

##### `RedisLockRegistry`和`GemfireLockRegistry`

`RedisLockRegistry`和`GemfireLockRegistry`现在可用于支持多个应用程序实例和服务器可见的全局锁。这些可以用于跨多个应用程序实例的聚合消息处理程序，从而仅在一个实例上发生组发布。有关更多信息，请参见[Redis 锁注册表](./redis.html#redis-lock-registry)，[Gemfire Lock 注册表](./gemfire.html#gemfire-lock-registry)和[Aggregator](./aggregator.html#aggregator)。

##### `@Poller`

基于注释的消息传递配置现在可以具有`poller`属性。这意味着用`@ServiceActivator`、`@Aggregator`注释的方法和类似的注释现在可以使用`inputChannel`，这是对`PollableChannel`的引用。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

##### `@InboundChannelAdapter`和`SmartLifecycle`用于带注释的端点

我们添加了`@InboundChannelAdapter`方法注释。它类似于`<int:inbound-channel-adapter>`XML 组件。此外，所有消息传递注释现在都提供`SmartLifecycle`选项。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

##### Twitter 搜索出站网关

我们添加了一个新的 Twitter 端点：`<int-twitter-search-outbound-gateway/>`。与每次使用相同搜索查询进行轮询的搜索入站适配器不同，出站网关允许按需定制查询。有关更多信息，请参见[Spring Integration Social Twitter](https://github.com/spring-projects/spring-integration-extensions/tree/main/spring-integration-social-twitter)。

##### Gemfire 元数据存储

我们添加了`GemfireMetadataStore`，让它在例如多个应用程序实例或服务器环境中的`AbstractPersistentAcceptOnceFileListFilter`实现中使用。有关更多信息，请参见[元数据存储](./meta-data-store.html#metadata-store)，[读取文件](./file.html#file-reading)，[FTP 入站通道适配器](./ftp.html#ftp-inbound)和[SFTP 入站通道适配器](./sftp.html#sftp-inbound)。

##### `@BridgeFrom`和`@BridgeTo`注释

我们引入了`@BridgeFrom`和`@BridgeTo``@Bean`方法注释，以在`@Configuration`类中标记`MessageChannel`bean。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

##### 元消息传递注释

消息注释（`@ServiceActivator`、`@Router`、`@MessagingGateway`等）现在可以配置为用户定义消息注释的元注释。此外，用户定义的注释可以具有相同的属性（`inputChannel`、`@Poller`、`autoStartup`等）。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

#### 一般变化

本部分描述了从 3.0 到 4.0 版本的一般更改。

##### 需要 Spring 框架 4.0

我们将核心消息抽象（`Message`、`MessageChannel`等）移动到了 Spring 框架`spring-messaging`模块。在代码中直接引用这些类的开发人员需要进行更改，如[3.0 到 4.0 迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-3.0-to-4.0-Migration-Guide)的第一部分所述。

##### XPath header Enricher 的 header 类型

我们为`<int-xml:xpath-header-enricher>`的`header`子元素引入了`header-type`属性。此属性为标头值提供目标类型（XPath 表达式求值的结果被转换为该标头值）。有关更多信息，请参见[XPath 报头 Enricher](./xml.html#xml-xpath-header-enricher)。

##### Object to JSON Transformer:Node Result

我们为`<int:object-to-json-transformer>`引入了`result-type`属性。此属性为将对象映射到 JSON 的结果提供目标类型。它支持`STRING`（默认值）和`NODE`。有关更多信息，请参见[自版本 3.0 起， Spring Integration 还提供了用于表达式的内置`#xpath`spel 函数。]（./Transformer.html#Transformer-XPath-Spel-function）。

##### JMS 头映射

现在，`DefaultJmsHeaderMapper`将传入的`JMSPriority`标头映射到 Spring Integration`priority`标头。以前，`priority`仅被考虑用于出站消息。有关更多信息，请参见[映射消息头到和来自 JMS 消息](./jms.html#jms-header-mapping)。

##### JMS 出站通道适配器

JMS 出站通道适配器现在支持`session-transacted`属性（默认：`false`）。以前，你必须插入自定义的`JmsTemplate`才能使用事务。见[出站通道适配器](./jms.html#jms-outbound-channel-adapter)。

##### JMS 入站通道适配器

JMS 入站通道适配器现在支持`session-transacted`属性（默认：`false`）。以前，你必须插入自定义的`JmsTemplate`才能使用事务。适配器允许在`acknowledgeMode`中进行“事务处理”，这是不正确的，并且不工作。这个值不再被允许。见[入站通道适配器](./jms.html#jms-inbound-channel-adapter)。

##### 数据类型通道

现在，你可以指定一个`MessageConverter`，用于在数据类型通道中将有效载荷转换为已接受的`datatype`实例之一时使用。有关更多信息，请参见[数据类型通道配置](./channel.html#channel-datatype-channel)。

##### 更简单的重试建议配置

我们添加了简化的名称空间支持来配置`RequestHandlerRetryAdvice`。有关更多信息，请参见[配置重试建议](./handler-advice.html#retry-config)。

##### 相关端点：基于时间的发布策略

我们将互斥的`group-timeout`和`group-timeout-expression`属性添加到`<int:aggregator>`和`<int:resequencer>`中。这些属性允许强制完成部分`MessageGroup`，前提是`ReleaseStrategy`不释放一个组并且在指定的时间内没有进一步的消息到达。有关更多信息，请参见[使用 XML 配置聚合器](./aggregator.html#aggregator-xml)。

##### Redis 元数据存储

`RedisMetadataStore`现在实现`ConcurrentMetadataStore`，例如，在多个应用程序实例或服务器环境中的`AbstractPersistentAcceptOnceFileListFilter`实现中使用它。有关更多信息，请参见[Redis 元数据存储](./redis.html#redis-metadata-store)，[读取文件](./file.html#file-reading)，[FTP 入站通道适配器](./ftp.html#ftp-inbound)和[SFTP 入站通道适配器](./sftp.html#sftp-inbound)。

##### `JdbcChannelMessageStore`和`PriorityChannel`

t`JdbcChannelMessageStore`现在实现`PriorityCapableChannelMessageStore`，让它被用作`message-store`实例的`priority-queue`引用。有关更多信息，请参见[支持消息通道](./jdbc.html#jdbc-message-store-channels)。

##### AMQP 端点交付模式

Spring 默认情况下，AMQP 在代理上创建持久性消息。你可以通过设置`amqp_deliveryMode`标头或自定义映射程序来重写此行为。我们向适配器添加了一个方便的`default-delivery-mode`属性，以提供对这一重要设置的更简单配置。有关更多信息，请参见[出站通道适配器](./amqp.html#amqp-outbound-channel-adapter)和[出站网关](./amqp.html#amqp-outbound-gateway)。

##### FTP 超时

现在`DefaultFtpSessionFactory`公开了`connectTimeout`、`defaultTimeout`和`dataTimeout`属性，从而避免了需要子类工厂来设置这些公共属性。对于更高级的配置，`postProcess*`方法仍然可用。有关更多信息，请参见[FTP Session Factory](./ftp.html#ftp-session-factory)。

##### 推特：`StatusUpdatingMessageHandler`

`StatusUpdatingMessageHandler`（`<int-twitter:outbound-channel-adapter>`）现在支持`tweet-data-expression`属性来构建用于更新时间轴状态的`org.springframework.social.twitter.api.TweetData`对象。例如，此功能允许附加图像。有关更多信息，请参见[Spring Integration Social Twitter](https://github.com/spring-projects/spring-integration-extensions/tree/main/spring-integration-social-twitter)。

#####  JPA 检索网关：`id-expression`

我们为`<int-jpa:retrieving-outbound-gateway>`引入了`id-expression`属性来执行`EntityManager.find(Class entityClass, Object primaryKey)`。有关更多信息，请参见[检索出站网关](./jpa.html#jpa-retrieving-outbound-gateway)。

##### TCP 反序列化事件

当一个标准的反序列化器遇到将输入流解码为消息的问题时，它现在会发出`TcpDeserializationExceptionEvent`，让应用程序在发生异常的地方检查数据。有关更多信息，请参见[TCP 连接事件](./ip.html#tcp-events)。

##### 上的消息传递注释`@Bean`定义

现在，你可以在`@Bean`中的`@ServiceActivator`、`@Router`、`@InboundChannelAdapter`和其他定义上配置消息传递注释（`@Configuration`类）。有关更多信息，请参见[注释支持](./configuration.html#annotations)。

### 2.2 和 3.0 之间的变化

有关可能影响应用程序的重要更改，请参见[迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-2.2-to-3.0-Migration-Guide)。你可以在[wiki](https://github.com/spring-projects/spring-integration/wiki)上找到所有回到 2.1 版本的迁移指南。

#### 新组件

3.0 版本增加了一些新的组件。

##### HTTP 请求映射

HTTP 模块现在为入站端点提供了强大的请求映射支持。我们将`UriPathHandlerMapping`类替换为`IntegrationRequestMappingHandlerMapping`类，该类在应用程序上下文中以 Bean 名`integrationRequestMappingHandlerMapping`注册。在解析 HTTP 入站端点时，要么注册一个新的`IntegrationRequestMappingHandlerMapping` Bean，要么重用一个现有的 Bean。为了实现灵活的请求映射配置， Spring 集成为`<request-mapping/>`和`<http:inbound-gateway/>`提供了`<request-mapping/>`的子元素。这两个 HTTP 入站端点现在完全基于 Spring MVC3.1 中引入的请求映射基础设施。例如，在单个入站端点上支持多个路径。有关更多信息，请参见[HTTP 命名空间支持](./http.html#http-namespace)。

#####  Spring 表达式语言配置

我们添加了一个新的`IntegrationEvaluationContextFactoryBean`，以允许在整个框架的 SPEL 表达式中配置自定义`PropertyAccessor`实现和函数。有关更多信息，请参见[Spring Expression Language (SpEL)](./spel.html#spel)。

##### spel 函数支持

为了使用静态`Method`函数定制 SPEL`EvaluationContext`函数，我们引入了`<spel-function/>`组件。我们还添加了两个内置函数：`#jsonPath`和`#xpath`。有关更多信息，请参见[SPEL 函数](./spel.html#spel-functions)。

##### spel PropertyAccessors 支持

为了使用`PropertyAccessor`实现来定制 SPEL`EvaluationContext`，我们添加了`<spel-property-accessors/>`组件。有关更多信息，请参见[属性访问器](./spel.html#spel-property-accessors)。

##### Redis:新组件

我们添加了一个新的基于 Redis 的[`MetadataStore`]（https://DOCS. Spring.io/ Spring-integration/api/org/springframework/integration/metadata/metadatastore.html）实现。你可以使用`RedisMetadataStore`在应用程序重新启动时维护`MetadataStore`的状态。这个新的`MetadataStore`实现可以与适配器一起使用，例如：

* Twitter 入站适配器

* 馈入入通道适配器

我们添加了新的基于队列的组件。我们添加了`<int-redis:queue-inbound-channel-adapter/>`和`<int-redis:queue-outbound-channel-adapter/>`组件，分别在 Redis 列表上执行“右 pop”和“左 push”操作。

有关更多信息，请参见“[Redis 支持](./redis.html#redis)”。

##### header 通道注册表

现在，你可以指示框架在注册表中存储应答通道和错误通道，以便以后进行解析。这对于`replyChannel`或`errorChannel`可能丢失的情况很有用（例如，在序列化消息时）。有关更多信息，请参见[页眉 Enricher](./content-enrichment.html#header-enricher)。

##### MongoDB 支持：new`ConfigurableMongoDbMessageStore`

除了现有的`eMongoDbMessageStore`，我们还引入了一个新的`ConfigurableMongoDbMessageStore`。这为 MongoDB 提供了一个更加健壮和灵活的`MessageStore`实现。它与现有的存储不具有向后兼容性，但我们建议将其用于新的应用程序。现有的应用程序可以使用它，但是旧商店中的消息不可用。有关更多信息，请参见[MongoDB 支持](./mongodb.html#mongodb)。

##### syslog 支持

Spring Integration3.0 以 2.2`SyslogToMapTransformer`为基础，引入了`UDP`和`TCP`入站通道适配器，这些适配器是专门为接收 SYSLOG 消息而定制的。有关更多信息，请参见[syslog 支持](./syslog.html#syslog)。

##### `tail`支持

我们添加了文件入站通道适配器，该适配器使用`tail`命令在将行添加到文本文件的末尾时生成消息。见[“跟踪”文件](./file.html#file-tailing)。

##### JMX 支持

我们添加了`<int-jmx:tree-polling-channel-adapter/>`。这个适配器查询 JMX MBean 树，并发送一条带有有效负载的消息，该负载是与查询匹配的对象的图形。默认情况下，MBean 映射到原语和简单对象（例如`Map`、`List`和数组）。它允许对例如 JSON 进行简单的转换。

现在，`IntegrationMBeanExporter`允许使用`naming-strategy`属性配置自定义的`ObjectNamingStrategy`。

有关更多信息，请参见[JMX 支持](./jmx.html#jmx)。

##### TCP/IP 连接事件和连接管理

`TcpConnection`实例现在在连接打开或关闭或发生异常时发出`ApplicationEvent`实例（特别是`TcpConnectionEvent`实例）。此更改使应用程序能够通过使用正常的 Spring `ApplicationListener`机制被告知对 TCP 连接的更改。

我们将`AbstractTcpConnection`更名为`TcpConnectionSupport`。作为这个类的子类的自定义连接可以使用它的方法来发布事件。类似地，我们将`AbstractTcpConnectionInterceptor`重命名为`TcpConnectionInterceptorSupport`。

此外，我们添加了`<int-ip:tcp-connection-event-inbound-channel-adapter/>`。默认情况下，此适配器将所有`TcpConnectionEvent`实例发送到`Channel`。

此外，TCP 连接工厂现在提供了一种名为`getOpenConnectionIds()`的新方法，该方法返回所有打开连接的标识符的列表。它允许应用程序广播到所有开放的连接，以及其他用途。

最后，连接工厂还提供了一种名为`closeConnection(String connectionId)`的新方法，该方法允许应用程序通过使用其 ID 显式地关闭连接。

有关更多信息，请参见[TCP 连接事件](./ip.html#tcp-events)。

##### 入站通道适配器脚本支持

`<int:inbound-channel-adapter/>`现在支持使用`<expression/>`和`<script/>`子元素来创建`MessageSource`。见[通道适配器表达式和脚本](./channel-adapter.html#channel-adapter-expressions-and-scripts)。

##### Content Enricher:Headers Enrichment 支持

Content Enricher 现在提供了`<header/>`子元素的配置，以根据来自底层消息流的回复消息使用头来丰富出站消息。有关更多信息，请参见[有效载荷 Enricher](./content-enrichment.html#payload-enricher)。

#### 一般变化

本节介绍从 2.2 版到 3.0 版的一般更改。

##### 消息 ID 生成

以前，消息 ID 是通过使用 JDK`UUID.randomUUID()`方法生成的。有了这个版本，默认的机制已经改变，使用了更有效和显著更快的算法。此外，我们还添加了更改用于生成消息 ID 的策略的功能。有关更多信息，请参见[消息 ID 生成](./message.html#message-id-generation)。

##### “\<gateway\>”变化

现在，你可以在所有网关方法中设置公共标头，并且我们还添加了更多选项，用于向消息中添加有关调用了哪个方法的信息。

现在，你可以完全自定义将网关方法调用映射到消息的方式。

`GatewayMethodMetadata`现在是一个公共类。它允许你以编程方式配置来自 Java 的`GatewayProxyFactoryBean`。

有关更多信息，请参见[消息传递网关](./gateway.html#gateway)。

##### http 端点变更

* **出站端点`encode-uri`**:`<http:outbound-gateway/>`和`<http:outbound-channel-adapter/>`现在提供一个`encode-uri`属性，允许在发送请求之前禁用 URI 对象的编码。

* **入站端点`merge-with-default-converters`**:`<http:inbound-gateway/>`和`<http:inbound-channel-adapter/>`现在具有一个`merge-with-default-converters`属性，以在自定义消息转换器之后包括默认`HttpMessageConverter`实例的列表。

* **`If-Modified-Since`和`If-Unmodified-Since`http 报头 **:以前，`If-Modified-Since`和`If-Unmodified-Since`http 报头在`DefaultHttpHeaderMapper`映射的 http 报头中被错误地处理。现在，除了纠正这个问题外，`DefaultHttpHeaderMapper`还为任何接受日期时间值的 HTTP 头提供了格式化字符串的日期解析。

* **入站端点表达式变量**:除了现有的`#requestParams`和`#pathVariables`之外，`<http:inbound-gateway/>`和`<http:inbound-channel-adapter/>`现在还支持额外的有用变量：`#matrixVariables`，`#requestHeaders`，以及`#cookies`。这些变量在有效负载表达式和报头表达式中都可用。

* **出站端点“uri-variables-expression”**:HTTPoutendpoints 现在支持<gtr="1687"/>属性，以指定<gtr="1688"/>，从而为 URL 模板中的所有 URI 变量占位符计算<gtr="1689"/>。这允许基于传出消息选择不同的表达式映射。

有关更多信息，请参见[HTTP 支持](./http.html#http)。

##### Jackson 支持

* 介绍了一种新的 JSON 转换抽象方法。 Classpath 当前提供了用于 Jackson1.x 和 Jackson2 的实现方式，其版本是通过存在于 Classpath 上来确定的。在此之前，只支持 Jackson1.x。

* `ObjectToJsonTransformer`和`JsonToObjectTransformer`现在发出/消耗包含类型信息的头。

有关更多信息，请参见[变压器](./transformer.html#transformer)中的“JSON Transformers”。

##### 链元素`id`属性

以前，`<chain>`中元素的`id`属性被忽略，并且在某些情况下被禁止。现在，`id`属性对于`<chain>`中的所有元素都是允许的。 Bean 链元素的名称是周围链的`id`和元素本身的`id`的组合。例如：“mychain$child.myTransformer.handler”。有关更多信息，请参见[消息处理程序链](./chain.html#chain)。

##### 聚合器“empty-group-min-timeout”属性

`AbstractCorrelatingMessageHandler`提供了一个名为`empty-group-min-timeout`的新属性，以允许空组到期在比到期部分组更长的时间表上运行。空组不会从`MessageStore`中删除，直到至少在此毫秒内未对其进行修改。有关更多信息，请参见[使用 XML 配置聚合器](./aggregator.html#aggregator-xml)。

##### 持久文件列表过滤器

使用持久性`MetadataStore`的新`FileListFilter`实现现在可用。你可以使用这些功能来防止系统重新启动后出现重复文件。有关更多信息，请参见[读取文件](./file.html#file-reading)，[FTP 入站通道适配器](./ftp.html#ftp-inbound)和[SFTP 入站通道适配器](./sftp.html#sftp-inbound)。

##### 脚本支持：变量更改

我们为脚本组件引入了一个新的`variables`属性。此外，内联脚本现在也允许变量绑定。有关更多信息，请参见[Groovy 支持](./groovy.html#groovy)和[脚本支持](./scripting.html#scripting)。

##### 直接通道负载平衡配置

以前，在通道的`LoadBalancingStrategy`子元素上配置`dispatcher`时，唯一可用的选项是使用预定义的值枚举，这不允许开发人员设置`LoadBalancingStrategy`的自定义实现。现在可以使用`load-balancer-ref`提供对`LoadBalancingStrategy`的自定义实现的引用。有关更多信息，请参见[`DirectChannel`]。

##### 发布订阅行为

在此之前，发送到没有订阅服务器的 \<publish-subscribe-channel/\>将返回`false`结果。如果与`MessagingTemplate`一起使用，这将导致抛出异常。现在，`PublishSubscribeChannel`有一个名为`minSubscribers`的属性（默认值：`0`）。如果消息至少发送到最小数量的订阅服务器，则认为发送操作成功（即使该数量为零）。如果应用程序希望在这些情况下获得异常，请将最小订阅服务器设置为至少 1。

##### ftp、sftp 和 ftps 的变化

默认情况下，FTP、SFTP 和 FTPS 端点不再缓存会话。

我们从所有端点删除了不推荐的`cached-sessions`属性。以前，由该属性的值控制的嵌入式缓存机制并不提供一种限制缓存大小的方法，而缓存的大小可能会无限增长。Release2.1 引入了`CachingConnectionFactory`，它成为了缓存会话的首选（现在也是唯一的）方式。

`CachingConnectionFactory`现在提供了一种新的方法：`resetCache()`。此方法会立即关闭空闲会话，并导致在使用中的会话在返回到缓存时关闭。

`DefaultSftpSessionFactory`（与`CachingSessionFactory`一起使用）现在支持在单个 SSH 连接上的多路复用通道（仅支持 SFTP）。

###### FTP、SFTP 和 FTPS 入站适配器

以前，无法覆盖用于处理从远程服务器检索的文件的默认过滤器。`filter`属性决定检索哪些文件，但`FileReadingMessageSource`使用`AcceptOnceFileListFilter`。这意味着，如果以与先前复制的文件相同的名称检索文件的新副本，则适配器不会发送任何消息。

在这个版本中，一个新的属性`local-filter`允许你覆盖缺省过滤器（例如，使用`AcceptAllFileListFilter`或其他一些自定义过滤器）。

如果你希望在 JVM 执行中维护`AcceptOnceFileListFilter`的行为，那么现在可以在文件系统上配置一个保留状态的自定义过滤器。

入站通道适配器现在支持`preserve-timestamp`属性，该属性将本地文件修改后的时间戳设置为来自服务器的时间戳（默认：`false`）。

###### FTP、SFTP 和 FTPS 网关

网关现在支持`mv`命令，从而可以重命名远程文件。

网关现在支持递归的`ls`和`mget`命令，从而能够检索远程文件树。

网关现在支持`put`和`mput`命令，从而能够将文件发送到远程服务器。

现在支持`local-filename-generator-expression`属性，从而能够在检索过程中对本地文件进行命名。默认情况下，使用与远程文件相同的名称。

现在支持`local-directory-expression`属性，从而能够在检索过程中（基于远程目录）命名本地目录。

###### 远程文件模板

在 FTP 和 SFTP 模块使用的`Session`实现上提供了一个新的高级抽象（`RemoteFileTemplate`）。虽然端点在内部使用它，但你也可以以编程方式使用此抽象。与所有 Spring 实现方式一样，它可靠地关闭底层会话，同时允许对会话的低级访问。

有关更多信息，请参见[FTP/FTPS 适配器](./ftp.html#ftp)和[SFTP 适配器](./sftp.html#sftp)。

##### 用于出站网关的“requires-reply”属性

所有出站网关（例如`<jdbc:outbound-gateway/>`或`<jms:outbound-gateway/>`）都是为“请求-回复”场景设计的。期望从外部服务获得响应，并将其发布到`reply-channel`或`replyChannel`消息头。然而，在某些情况下，外部系统可能并不总是返回一个结果（例如，当一个 SELECT 以一个空的`ResultSet`结束时，一个`<jdbc:outbound-gateway/>`或者一个单向 Web 服务）。因此，开发人员需要一个选项来配置是否需要回复。为此，我们为出站网关组件引入了`requires-reply`属性。在大多数情况下，`requires-reply`的默认值是`true`。如果没有结果，则抛出一个`ReplyRequiredException`。将值更改为`false`意味着，如果外部服务不返回任何东西，消息流将在该点结束，类似于出站通道适配器。

|   |WebService 出站网关有一个名为`ignore-empty-responses`的附加属性，<br/>它用于将一个空的`String`响应视为没有收到响应，<br/>默认情况下，它是`true`，但是，你可以将它设置为`false`，以允许应用程序在回复消息有效负载中接收空的`String`，<br/>当属性为`true`时，出于`requires-reply`属性的目的，空字符串将被视为无响应。，默认情况下，<br/>，对于 WebService 出站网关，`requires-reply`为 false。|
|---| |

请注意，`requiresReply`属性以前存在，但在`AbstractReplyProducingMessageHandler`中设置为`false`，并且无法通过使用 XML 命名空间在出站网关上配置它。

|   |以前，没有收到回复的网关将静默地结束流（带有调试日志消息）。<br/>默认情况下，通过此更改，大多数网关现在都会引发异常。<br/>要恢复到以前的行为，请将`requires-reply`设置为`false`。|
|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

##### AMQP 出站网关报头映射

在此之前，\<int-amqp:outbound-gateway/\>在调用消息转换器之前映射头文件，并且转换器可以覆盖诸如`content-type`之类的头文件。出站适配器映射转换后的头，这意味着使用出站`content-type`（如果存在）中的`Message`之类的头。

从这个版本开始，网关现在映射消息转换后的头，与适配器保持一致。如果你的应用程序依赖于以前的行为（在此情况下，转换器的标头会覆盖映射的标头），那么你需要过滤这些标头（在消息到达网关之前），或者适当地设置它们。受`SimpleMessageConverter`影响的头是`content-type`和`content-encoding`。自定义消息转换器可以设置其他头。

##### 存储过程组件的改进

对于标准`CallableStatement.getObject`方法不支持的更复杂的特定于数据库的类型，我们向带有外向的`<sql-parameter-definition/>`元素引入了两个新的附加属性：

* `type-name`

* `return-type`

存储过程入站通道适配器的`row-mapper`属性`<returning-resultset/>`子元素现在支持对`RowMapper` Bean 定义的引用。以前，它只包含一个类名（仍然支持）。

有关更多信息，请参见[存储过程](./jdbc.html#stored-procedures)。

##### Web 服务出站 URI 配置

Web 服务出站网关“URI”属性现在支持对 Spring Web 服务支持的所有 URI 方案的`<uri-variable/>`替换。有关更多信息，请参见[出站 URI 配置](./ws.html#outbound-uri)。

##### Redis 适配器更改

Redis 入站通道适配器现在可以为`serializer`属性使用`null`值，原始数据是消息有效负载。

Redis 出站通道适配器现在具有`topic-expression`属性，以在运行时确定`Message`的 Redis 主题。

除了现有的`topics`属性外，Redis 入站通道适配器现在还具有`topic-patterns`属性。

有关更多信息，请参见[Redis 支持](./redis.html#redis)。

##### 建议过滤器

以前，当 a`<filter/>`具有 a`<request-handler-advice-chain/>`时，丢弃操作全部在建议链的范围内执行（包括`discard-channel`上的任何下游流）。过滤器元素现在有一个名为`discard-within-advice`的属性（默认：`true`），以允许在建议链完成后执行丢弃操作。见[建议过滤器](./handler-advice.html#advising-filters)。

##### 使用注释通知端点

现在可以使用注释来配置请求处理程序建议链。见[使用注释为端点提供建议](./handler-advice.html#advising-with-annotations)。

##### ObjectToStringTransformer 改进

这个转换器现在将`byte[]`和`char[]`有效负载正确地转换为`String`。有关更多信息，请参见[变压器](./transformer.html#transformer)。

#####  JPA 支持变更

要持久化或合并的有效负载现在可以是`[java.lang.Iterable](https://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html)`类型。

在这种情况下，`Iterable`返回的每个对象都被视为一个实体，并通过使用底层`EntityManager`进行持久化或合并。迭代器返回的空值将被忽略。

JPA 适配器现在具有额外的属性，以便在执行持久性操作后从关联的持久性上下文中可选地刷新和清除实体。

检索网关没有指定要检索的第一条记录的机制，这是一个常见的用例。检索网关现在支持通过在网关定义中添加`first-result`和`first-result-expression`属性来指定此参数。有关更多信息，请参见[检索出站网关](./jpa.html#jpa-retrieving-outbound-gateway)。

JPA 检索网关和入站适配器现在具有一个属性，该属性将结果集中的最大结果数指定为表达式。此外，我们引入了`max-results`属性来替换已被弃用的`max-number-of-results`。`max-results`和`max-results-expression`分别用于在结果集中提供最大结果数或表达式来计算最大结果数。

有关更多信息，请参见[JPA Support](./jpa.html#jpa)。

##### DeLayer:延迟表达式

以前，`<delayer>`提供了一个`delay-header-name`属性来确定运行时的延迟值。在复杂的情况下，`<delayer>`之前必须加上`<header-enricher>`。 Spring Integration3.0 引入了`expression`属性和`expression`子元素来进行动态延迟确定。现在不推荐`delay-header-name`属性，因为你可以在`expression`中指定 header 求值。此外，我们引入了`ignore-expression-failures`来控制表达式求值失败时的行为。有关更多信息，请参见[Delayer](./delayer.html#delayer)。

##### JDBC 消息存储的改进

Spring Integration3.0 为 MySQL 版本 5.6.4 及更高版本添加了一组新的 DDL 脚本。现在，MySQL 支持小数秒，因此在基于 MySQL 的消息存储中进行轮询时，FIFO 排序得到了改善。有关更多信息，请参见[通用的 JDBC 消息存储](./jdbc.html#jdbc-message-store-generic)。

##### IMAP 空闲连接异常

以前，如果 IMAP 空闲连接失败，它将被记录，但是没有通知应用程序的机制。这样的异常现在生成`ApplicationEvent`实例。应用程序可以通过使用`<int-event:inbound-channel-adapter>`或任何`ApplicationListener`配置为接收`ImapIdleExceptionEvent`（或其超类之一）来获得这些事件。

##### 消息头和 TCP

TCP 连接工厂现在启用了一种灵活机制的配置，可以在 TCP 上传输选定的报头（以及有效负载）。一个新的`TcpMessageMapper`启用了对头的选择，并且你需要配置一个适当的序列化器或反序列化器来将生成的`Map`写入 TCP 流。我们添加了`MapJsonSerializer`作为在 TCP 上传输报头和有效负载的方便机制。有关更多信息，请参见[传输头](./ip.html#ip-headers)。

##### JMS 消息驱动通道适配器

以前，在配置`<message-driven-channel-adapter/>`时，如果希望使用特定的`TaskExecutor`，则必须声明一个容器 Bean，并通过设置`container`属性将其提供给适配器。我们添加了`task-executor`，让它直接在适配器上设置。这是对已经可用的其他几个容器属性的补充。

##### RMI 入站网关

RMI 入站网关现在支持`error-channel`属性。见[入站 RMI](./rmi.html#rmi-inbound)。

##### `XsltPayloadTransformer`

现在可以通过设置`transformer-factory-class`属性来指定 Transformer 工厂类名称。见`[XsltPayloadTransformer](./xml.html#xml-xslt-payload-transformers)`。

### 2.1 与 2.2 之间的变化

有关可能影响应用程序的重要更改，请参见[迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-2.1-to-2.2-Migration-Guide)。你可以在[wiki](https://github.com/spring-projects/spring-integration/wiki)上找到所有回到 2.1 版本的迁移指南。

#### 新组件

2.2 版增加了一些新的组件。

##### `RedisStore`入站和出站通道适配器

Spring 集成现在具有`RedisStore`入站和出站通道适配器，允许你写入和读取与 Redis 集合之间的`Message`有效负载。有关更多信息，请参见[恢复存储出站通道适配器](./redis.html#redis-store-outbound-channel-adapter)和[Redis 存储入站通道适配器](./redis.html#redis-store-inbound-channel-adapter)。

##### MongoDB 入站和出站通道适配器

Spring 集成现在具有 MongoDB 入站和出站通道适配器，允许你编写和读取与 MongoDB 文档存储之间的`Message`有效负载。有关更多信息，请参见[MongoDB 出站通道适配器](./mongodb.html#mongodb-outbound-channel-adapter)和[MongoDB 入站通道适配器](./mongodb.html#mongodb-inbound-channel-adapter)。

#####  JPA 端点

Spring 集成现在包括用于检索和持久化 JPA 实体对象的 Java 持久化 API（ JPA）的组件。 JPA 适配器包括以下组件：

* [入站通道适配器](./jpa.html#jpa-inbound-channel-adapter)

* [出站通道适配器](./jpa.html#jpa-outbound-channel-adapter)

* [更新出站网关](./jpa.html#jpa-updating-outbound-gateway)

* [检索出站网关](./jpa.html#jpa-retrieving-outbound-gateway)

有关更多信息，请参见[JPA Support](./jpa.html#jpa)。

#### 一般变动

本部分描述了从版本 2.1 到版本 2.2 的一般更改。

#####  Spring 3.1 默认使用

Spring 集成现在使用 Spring 3.1。

##### 向端点添加行为

向 poller 添加`<advice-chain/>`的功能已经有一段时间了。然而，由此添加的行为会影响整个集成流。它没有解决向单个端点添加（例如）重试的功能。2.2 版本向许多端点引入了`<request-handler-advice-chain/>`。

此外，我们为此目的添加了三个标准建议类：

* `MessageHandlerRetryAdvice`

* `MessageHandlerCircuitBreakerAdvice`

* `ExpressionEvaluatingMessageHandlerAdvice`

有关更多信息，请参见[向端点添加行为](./handler-advice.html#message-handler-advice-chain)。

##### 事务同步与伪事务

Pollers 现在可以参与 Spring 的事务同步功能。这允许同步诸如由入站通道适配器重命名文件这样的操作，这取决于事务是提交还是回滚。

此外，你可以通过`PseudoTransactionManager`在不存在“实际”事务的情况下启用这些功能。

有关更多信息，请参见[事务同步](./transactions.html#transaction-synchronization)。

##### 文件适配器：改进的文件覆盖和追加处理

当使用文件出站通道适配器或文件出站网关时，可以使用新的`mode`属性。在 Spring Integration2.2 之前，目标文件在它们存在时被替换。现在你可以指定以下选项：

* `REPLACE`（默认）

* `APPEND`

* `FAIL`

* `IGNORE`

有关更多信息，请参见[处理现有的目标文件](./file.html#file-writing-destination-exists)。

##### 回复-超时添加到更多出站网关

XML 名称空间支持将 Reply-Timeout 属性添加到以下出站网关：

* AMQP 出站网关

* 文件出站网关

* FTP 出站网关

* SFTP 出站网关

* WS 出站网关

#####  Spring-AMQP1.1

Spring 集成现在使用 Spring AMQP1.1。这使得能够在 Spring 集成应用程序中使用几个特征，包括以下内容：

* 出站网关的固定应答队列

* HA（镜像）队列

* 发布者确认

* 返回的消息

* 支持死信交换和死信队列

##### JDBC 支持-存储过程组件

###### spel 支持

当使用 Spring 集成 JDBC 适配器的存储过程组件时，现在可以通过使用 Spring 表达式语言提供存储过程名称或存储函数名称。

这样做可以让你指定要在运行时调用的存储过程。例如，你可以提供希望通过消息头执行的存储过程名。有关更多信息，请参见[存储过程](./jdbc.html#stored-procedures)。

###### JMX 支持

存储过程组件现在提供了基本的 JMX 支持，将它们的一些属性公开为 MBean:

* 存储过程名称

* 存储过程名表达式

* `JdbcCallOperations`缓存统计

##### JDBC 支持：出站网关

当你使用 JDBC 出站网关时，更新查询不再是强制性的。现在，你可以使用请求消息作为参数源，仅提供一个 SELECT 查询。

##### JDBC 支持：通道特定的消息存储实现

我们添加了一个新的消息通道特定的消息存储实现，使用数据库特定的 SQL 查询提供了一个更具可伸缩性的解决方案。有关更多信息，请参见[支持消息通道](./jdbc.html#jdbc-message-store-channels)。

##### 有序关停

我们在`IntegrationMBeanExporter`中添加了一个名为`stopActiveComponents()`的方法。 Spring 它允许以有序的方式关闭集成应用程序，不允许向某些适配器发送新的入站消息，并等待一段时间以允许飞行中的消息完成。

##### JMS 出站网关改进

现在，你可以将 JMS 出站网关配置为使用`MessageListener`容器来接收回复。这样做可以提高网关的性能。

##### `ObjectToJsonTransformer`

默认情况下，`ObjectToJsonTransformer`现在将`content-type`头设置为`application/json`。有关更多信息，请参见[变压器](./transformer.html#transformer)。

##### http 支持

默认情况下，HTTP 上的 Java 序列化不再启用。以前，在`Serializable`对象上设置`expected-response-type`时，`Accept`头没有正确设置。我们更新了`SerializingHttpMessageConverter`，将`Accept`标头设置为`application/x-java-serialized-object`。但是，由于这可能会导致与现有应用程序不兼容，因此我们决定不再自动将此转换器添加到 HTTP 端点。

如果希望使用 Java 序列化，则需要通过使用`message-converters`属性（当你使用 XML 配置时）或使用`setMessageConverters()`方法（在 Java 中）将`SerializingHttpMessageConverter`添加到适当的端点。

或者，你也可以考虑使用 JSON。在 Classpath 上有`Jackson`使其成为可能。

### 2.0 和 2.1 之间的变化

有关可能影响应用程序的重要更改，请参见[迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-2.0-to-2.1-Migration-Guide)。

#### 新组件

版本 2.1 增加了一些新的组件。

##### JSR-223 脚本支持

在 Spring Integration2.0 中，我们添加了对[Groovy](https://groovy.codehaus.org/)的支持。在 Spring Integration2.1 中，我们通过实现对[JSR-223](https://www.jcp.org/en/jsr/detail?id=223)（“Java 平台的脚本”）的支持，在很大程度上扩展了对其他语言的支持。现在你可以使用任何支持 JSR-223 的脚本语言了，包括：

* JavaScript

* Ruby 和 JRuby

* Python 和 Jython

* Groovy

详情见[脚本支持](./scripting.html#scripting)。

##### Gemfire 支援

Spring Integration 通过提供用于条目和连续查询事件的入站适配器、用于将条目写入缓存的出站适配器和[]（https://DOCS. Spring.io/ Spring-Integration/api/org/SpringAgestore.html）和[]（https://DOCS. Spring.io/ Spring-integration/api/api/groupIntegration/org/org/store.html）来提供对的支持。 Spring 集成利用了[Spring Gemfire](https://spring.io/projects/spring-data-gemfire)项目，在其组件上提供了一个薄的包装器。

详情见[Pivotal Gemfire 和 Apache Geode 支持](./gemfire.html#gemfire)。

##### AMQP 支持

Spring Integration2.1 添加了几个用于通过使用[高级消息队列协议](https://www.amqp.org/)接收和发送消息的通道适配器。 Spring 此外，集成还提供了点对点消息通道和发布-订阅消息通道，这两个通道都由 AMQP 交换和队列支持。

详情见[AMQP 支持](./amqp.html#amqp)。

##### MongoDB 支持

在版本 2.1 中， Spring 集成通过提供基于 MongoDB 的`MessageStore`，为[MongoDB](https://www.mongodb.org/)提供了支持。

详情见[MongoDB 支持](./mongodb.html#mongodb)。

##### Redis 支持

从版本 2.1 开始， Spring 集成通过提供基于 REDIS 的`MessageStore`以及发布-订阅消息适配器，支持[Redis](https://redis.io/)，这是一种高级的键值存储。

详情见[Redis 支持](./redis.html#redis)。

##### 对 Spring 资源抽象的支持

在版本 2.1 中，我们引入了一个新的资源入站通道适配器，该适配器基于 Spring 的资源抽象，以支持跨各种实际类型的底层资源（例如文件、URL 或 Classpath 资源）的更大灵活性。因此，它与文件入站通道适配器类似，但更通用。

详情见[资源入站通道适配器](./resource.html#resource-inbound-channel-adapter)。

##### 存储过程组件

借助 Spring Integration2.1，`JDBC`模块还通过添加几个新组件来提供存储过程支持，这些组件包括入站和出站通道适配器以及出站网关。存储过程支持利用 Spring 的[`SimpleJdbcCall`]（https://DOCS. Spring.io/ Spring-framework/DOCS/current/javadoc-api/org/springframework/jdbc/core/simplejdbccall.html）类，因此支持以下存储过程：

* 阿帕奇德比

* DB2

* MySQL

* Microsoft SQL Server

* 甲骨文

* PostgreSQL

* Sybase

存储过程组件还支持以下数据库的 SQL 函数：

* MySQL

* Microsoft SQL Server

* 甲骨文

* PostgreSQL

详情见[存储过程](./jdbc.html#stored-procedures)。

##### XPath 和 XML 验证过滤器

Spring Integration2.1 提供了一种新的基于 XPath 的消息过滤器。它是`XML`模块的一部分。XPath 过滤器允许你通过使用 XPath 表达式来过滤消息。我们还为 XML 验证过滤器添加了文档。

有关更多详细信息，请参见[使用 XPath 过滤器](./xml.html#xml-xpath-filter)和[XML 验证过滤器](./xml.html#xml-validating-filter)。

##### 有效载荷 Enricher

自 Spring 集成 2.1 以来，我们添加了有效负载 Enricher。有效负载 Enricher 定义了一个端点，该端点通常将[`Message`]（https://DOCS. Spring.io/ Spring-integration/api/org/springframework/integration/message.html）传递到公开的请求通道，然后期望得到一条回复消息。然后，回复消息将成为表达式求值的根对象，以丰富目标有效负载。

详情见[有效载荷 Enricher](./content-enrichment.html#payload-enricher)。

##### FTP 和 SFTP 出站网关

Spring Integration2.1 提供了两个新的出站网关，以与远程文件传输协议或 SFT 服务器进行交互。这两个网关允许你直接执行一组有限的远程命令。

例如，你可以使用这些出站网关来列出、检索和删除远程文件，并让 Spring 集成消息流继续执行远程服务器的响应。

详情见[FTP 出站网关](./ftp.html#ftp-outbound-gateway)和[SFTP 出站网关](./sftp.html#sftp-outbound-gateway)。

##### ftp会话缓存

从版本 2.1 开始，我们在会话远程文件适配器（例如，FTP、SFTP 和其他）的管理方面展示了更大的灵活性。

具体地说，我们不赞成`cache-sessions`属性（可通过 XML 名称空间支持获得）。作为替代，我们在`CachingSessionFactory`上添加了`sessionCacheSize`和`sessionWaitTimeout`属性。

详情见[FTP Session Caching](./ftp.html#ftp-session-caching)和[SFTP Session Caching](./sftp.html#sftp-session-caching)。

#### 框架重构

我们以多种方式重构了 Spring 集成框架，所有这些都在本节中进行了描述。

##### 标准化路由器配置

我们使用 Spring Integration2.1 在所有路由器实现中标准化了路由器参数，以提供更一致的用户体验。

在 Spring Integration2.1 中，我们删除了`ignore-channel-name-resolution-failures`属性，以便用`resolution-required`属性合并其行为。另外，`resolution-required`属性现在默认为`true`。

从 Spring Integration2.1 开始，如果没有定义默认的输出通道，路由器将不再静默地删除任何消息。这意味着，在默认情况下，路由器现在至少需要一个解析通道（如果没有设置`default-output-channel`），并且在默认情况下，如果没有确定通道（或者发送尝试未成功），则抛出`MessageDeliveryException`。

但是，如果你确实希望静默地删除消息，则可以设置`default-output-channel="nullChannel"`。

|   |Spring 随着路由器参数的标准化和前面描述的参数的合并，旧的基于集成的应用程序可能会中断。|
|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------|

详情见`[Routers](./router.html#router)`。

##### XML 模式更新到 2.1

Spring Integration2.1 附带了更新的 XML 模式（版本 2.1）。它提供了许多改进，例如路由器标准化[前面讨论过](#x2.1-router-standardization)。

从现在开始，开发人员必须始终声明最新的 XML 模式（当前版本为 2.1）。或者，他们可以使用无版本模式。通常，最好的选择是使用无版本名称空间，因为这些名称空间自动使用 Spring 集成的最新可用版本。

下面的示例声明了一个无版本 Spring 集成名称空间：

```
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:int="http://www.springframework.org/schema/integration"
   xsi:schemaLocation="http://www.springframework.org/schema/integration
           https://www.springframework.org/schema/integration/spring-integration.xsd
           http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd">
...
</beans>
```

下面的示例声明了一个具有显式版本的 Spring 集成名称空间：

```
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:int="http://www.springframework.org/schema/integration"
   xsi:schemaLocation="http://www.springframework.org/schema/integration
           https://www.springframework.org/schema/integration/spring-integration-2.2.xsd
           http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd">
...
</beans>
```

旧的 1.0 和 2.0 模式仍然存在。但是，如果应用程序上下文仍然引用那些不受欢迎的模式之一，则验证器在初始化时将失败。

#### 源控制管理和构建基础设施

版本 2.1 引入了对源代码控制管理和构建基础架构的一些更改。这一节涵盖了这些变化。

##### 现在托管在 GitHub 上的源代码

自版本 2.0 以来， Spring 集成项目使用[Git](https://git-scm.com/)进行版本控制。为了进一步提高社区可见性，该项目从 SpringSource 托管的 Git 存储库转移到[Github](https://www.github.com/)。 Spring 集成 Git 存储库位于：[spring-integration](https://github.com/spring-projects/spring-integration)。

对于该项目，我们还改进了提供代码贡献的过程。此外，我们确保每一项承诺都经过同行评审。实际上，核心提交者现在遵循与贡献者相同的过程。有关更多详细信息，请参见[贡献](https://github.com/spring-projects/spring-integration/blob/main/CONTRIBUTING.adoc)。

##### 改进了声纳的源代码可见性

为了提供更好的源代码可见性，从而监视 Spring Integration 的源代码的质量，我们设置了[Sonar](https://www.sonarqube.org/)的实例。我们每天晚上收集指标，并在[sonar.spring.io](https://sonar.spring.io/dashboard?id=org.springframework.integration%3Aspring-integration%3Amain)上提供这些指标。

#### 新样本

对于 Spring 集成的 2.1 版本，我们还扩展了 Spring 集成示例项目，并添加了许多新的示例，例如涵盖 AMQP 支持的示例，一个示例展示了新的有效负载 Enricher，一个示例演示了用于测试 Spring 集成流片段的技术，以及针对 Oracle 数据库执行存储过程的示例。详情请访问[spring-integration-samples](https://github.com/spring-projects/spring-integration-samples)。

### 1.0 和 2.0 版本之间的变化

有关可能影响应用程序的重要更改，请参见[迁移指南](https://github.com/spring-projects/spring-integration/wiki/Spring-Integration-1.0-to-2.0-Migration-Guide)。

####  Spring 3 支持

Spring Integration2.0 是建立在 Spring 3.0.5 之上的，并使其许多功能可供我们的用户使用。

[[2.0-spel-support]]===== 支持 Spring 表达式语言

现在，你可以在 Spring Integration Core 命名空间的 Transformer、Router、Filter、Splitter、Aggregator、Service-Activator、Header-Enrich 和许多其他元素中以及在各种适配器中使用 SPEL 表达式。这本指南包括许多样本。

##### 转换服务和转换器

现在可以在配置许多 Spring 集成组件时受益于 Spring 提供的转换服务支持，例如[数据类型通道](https://www.enterpriseintegrationpatterns.com/DatatypeChannel.html)。见[消息通道实现](./channel.html#channel-implementations)和[服务激活器](./service-activator.html#service-activator)。同样，前面提到的 SPEL 支持也依赖于转换服务。因此，你可以注册转换器一次，并在任何使用 SPEL 表达式的地方利用它们。

##### `TaskScheduler`和`Trigger`

Spring 3.0 定义了两种与调度相关的新策略：`TaskScheduler`和`Trigger`。 Spring 集成（它使用大量的调度）现在建立在这些基础上。实际上， Spring Integration1.0 最初定义了一些组件（例如`CronTrigger`），这些组件现在已经迁移到 Spring 3.0 的核心 API 中。现在，你可以在整个应用程序上下文中重用相同的组件（而不仅仅是 Spring 集成配置）。通过提供用于直接配置速率、延迟、CRON 表达式和触发器引用的属性，我们还极大地简化了 Spring Integration Pollers 的配置。有关示例配置，请参见[通道适配器](./channel-adapter.html#channel-adapter)。

##### `RestTemplate`和`HttpMessageConverter`

我们的出站 HTTP 适配器现在委托给 Spring 的`RestTemplate`以执行 HTTP 请求并处理其响应。这也意味着你可以重用任何自定义`HttpMessageConverter`实现。有关更多详细信息，请参见[HTTP 出站组件](./http.html#http-outbound)。

#### Enterprise 集成模式添加

同样在 2.0 中，我们增加了对 Hohpe 和 Woolf 的[Enterprise 整合模式](https://www.enterpriseintegrationpatterns.com/)书中描述的更多模式的支持。

##### 消息历史记录

我们现在提供对[消息历史](https://www.enterpriseintegrationpatterns.com/MessageHistory.html)模式的支持，让你跟踪所有遍历的组件，包括每个通道和端点的名称以及遍历的时间戳。有关更多详细信息，请参见[消息历史](./message-history.html#message-history)。

##### 消息存储

我们现在为[消息存储](https://www.enterpriseintegrationpatterns.com/MessageStore.html)模式提供支持。消息存储提供了一种策略，用于代表其作用域超出单个事务的任何进程（例如聚合器和重排序程序）持久化消息。本指南的许多部分包括如何使用消息存储的示例，因为它会影响 Spring 集成的几个领域。更多详情请参见[消息存储](./message-store.html#message-store)，[索赔检查](./claim-check.html#claim-check)，[消息通道](./channel.html#channel)，[Aggregator](./aggregator.html#aggregator)，[JDBC 支持](./jdbc.html#jdbc)“，以及[重测序器](./resequencer.html#resequencer)。

##### 索赔检查

我们添加了[索赔检查](https://www.enterpriseintegrationpatterns.com/StoreInLibrary.html)模式的实现。索赔检查模式背后的想法是，你可以将消息有效载荷交换为“索赔票据”。这使你可以减少带宽，并避免跨通道发送消息时潜在的安全问题。有关更多详细信息，请参见[索赔检查](./claim-check.html#claim-check)。

##### 控制总线

我们已经提供了[控制总线](https://www.enterpriseintegrationpatterns.com/ControlBus.html)模式的实现，它允许你使用消息传递来管理和监视端点和通道。这些实现包括基于 SPEL 的方法和运行 Groovy 脚本的方法。有关更多详细信息，请参见[控制总线](./control-bus.html#control-bus)和[控制总线](./groovy.html#groovy-control-bus)。

#### 新通道适配器和网关

在 Spring Integration2.0 中，我们添加了几个新的通道适配器和消息传递网关。

##### TCP 和 UDP 适配器

我们添加了用于通过 TCP 和 UDP Internet 协议接收和发送消息的通道适配器。有关更多详细信息，请参见[TCP 和 UDP 支持](./ip.html#ip)。另见以下博客：[“Using UDP and TCP Adapters in Spring Integration 2.0 M3”](https://spring.io/blog/2010/03/29/using-udp-and-tcp-adapters-in-spring-integration-2-0-m3/)。

##### Twitter 适配器

Twitter 适配器支持发送和接收 Twitter 状态更新以及直接消息。你还可以使用入站通道适配器执行 Twitter 搜索。有关更多详细信息，请参见[Spring Integration Social Twitter](https://github.com/spring-projects/spring-integration-extensions/tree/main/spring-integration-social-twitter)。

##### XMPP 适配器

新的 XMPP 适配器支持聊天消息和存在事件。有关更多详细信息，请参见[XMPP 支持](./xmpp.html#xmpp)。

##### FTP 和 FTPS 适配器

通过 FTP 和 FTPS 的入站和出站文件传输支持现在可用。有关更多详细信息，请参见[FTP/FTPS 适配器](./ftp.html#ftp)。

##### SFTP 适配器

通过 SFTP 的入站和出站文件传输支持现在可用。有关更多详细信息，请参见[SFTP 适配器](./sftp.html#sftp)。

##### 提要适配器

我们还添加了用于接收新闻提要的通道适配器（Atom 和 RSS）。有关更多详细信息，请参见[馈源适配器](./feed.html#feed)。

#### 其他添加项

Spring 集成添加了许多其他功能。这一节对它们进行了描述。

##### Groovy 支持

Spring Integration2.0 增加了 Groovy 支持，允许你使用 Groovy 脚本语言来提供集成和业务逻辑。有关更多详细信息，请参见[Groovy 支持](./groovy.html#groovy)。

##### 地图变形金刚

这些对称的转换器将有效负载对象转换为`Map`对象。有关更多详细信息，请参见[变压器](./transformer.html#transformer)。

##### JSON 变形金刚

这些对称的转换器将有效负载对象转换成 JSON 和 JSON。有关更多详细信息，请参见[变压器](./transformer.html#transformer)。

##### 连载变形金刚

这些对称的转换器将有效负载对象与字节数组进行转换。它们还支持 Spring 3.0.5 添加的序列化器和反序列化器策略接口。有关更多详细信息，请参见[变压器](./transformer.html#transformer)。

#### 框架重构

核心 API 进行了一些重要的重构，以使其更简单、更可用。尽管我们预计对开发人员的影响应该是最小的，但你应该通读本文档以找到更改的内容。具体地说，你应该阅读[动态路由器](./router.html#dynamic-routers)，[消息传递网关](./gateway.html#gateway)，[HTTP 出站组件](./http.html#http-outbound)，[Message](./message.html#message)，以及[Aggregator](./aggregator.html#aggregator)。如果直接依赖一些核心组件（`Message`、`MessageHeaders`、`MessageChannel`、`MessageBuilder`等），则需要更新任何导入语句。我们重组了一些打包，以提供扩展域模型所需的灵活性，同时避免任何周期性的依赖关系（这是框架的一项策略，以避免此类“混乱”）。

#### 新的源代码控制管理和构建基础架构

在 Spring Integration2.0 中，我们将构建环境转换为使用 Git 进行源代码控制。要访问我们的存储库，请访问[https://git.springsource.org/spring-integration](https://git.springsource.org/spring-integration)。我们还将构建系统切换到[Gradle](https://gradle.org/)。

#### 新 Spring 集成样本

在 Spring Integration2.0 中，我们已经将样本与我们的主发布分布进行了解耦。请阅读以下博客获取更多信息：[New Spring Integration Samples](https://spring.io/blog/2010/09/29/new-spring-integration-samples/)。我们还创建了许多新的示例，包括每个新适配器的示例。

#### 用于 Spring 集成的工具套件可视化编辑器

在最新版本的 SpringSource 工具套件中包含一个用于 Spring 集成的令人惊讶的新可视化编辑器。如果你还没有使用 STS，你可以在[Spring Tool Suite](https://spring.io/tools/sts)下载它。