2.2 和 3.0 之间的变化

请参阅 迁移指南,了解可能影响您应用程序的重要更改。您可以在 wiki 上找到所有版本(回溯到 2.1)的迁移指南。

新组件

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

HTTP 请求映射

HTTP 模块现在为入站端点提供了强大的请求映射支持。我们用 IntegrationRequestMappingHandlerMapping 类替换了 UriPathHandlerMapping 类,该类在应用程序上下文中以 bean 名称 integrationRequestMappingHandlerMapping 注册。解析 HTTP 入站端点时,会注册一个新的 IntegrationRequestMappingHandlerMapping bean 或重用一个现有 bean。为了实现灵活的请求映射配置,Spring Integration 为 <http:inbound-channel-adapter/><http:inbound-gateway/> 提供了 <request-mapping/> 子元素。这两个 HTTP 入站端点现在完全基于 Spring MVC 3.1 引入的请求映射基础设施。例如,单个入站端点支持多个路径。有关更多信息,请参阅 HTTP 命名空间支持

Spring 表达式语言 (SpEL) 配置

我们添加了一个新的 IntegrationEvaluationContextFactoryBean,允许配置自定义 PropertyAccessor 实现和函数,以便在整个框架中的 SpEL 表达式中使用。有关更多信息,请参阅 Spring 表达式语言 (SpEL)

SpEL 函数支持

为了使用静态 Method 函数自定义 SpEL EvaluationContext,我们引入了 <spel-function/> 组件。我们还添加了两个内置函数:#jsonPath#xpath。有关更多信息,请参阅 SpEL 函数

SpEL PropertyAccessors 支持

为了使用 PropertyAccessor 实现自定义 SpEL EvaluationContext,我们添加了 <spel-property-accessors/> 组件。有关更多信息,请参阅 属性访问器

Redis:新组件

我们添加了一个新的基于 Redis 的 MetadataStore 实现。您可以使用 RedisMetadataStore 在应用程序重新启动后维护 MetadataStore 的状态。这个新的 MetadataStore 实现可以与适配器一起使用,例如:

  • Twitter 入站适配器

  • Feed 入站通道适配器

我们添加了新的基于队列的组件。我们添加了 <int-redis:queue-inbound-channel-adapter/><int-redis:queue-outbound-channel-adapter/> 组件,分别对 Redis List 执行“右弹出”和“左推入”操作。

有关更多信息,请参阅 “Redis 支持”。

头部通道注册表

您现在可以指示框架将回复通道和错误通道存储在注册表中以供以后解析。这对于 replyChannelerrorChannel 可能会丢失的情况很有用(例如,序列化消息时)。有关更多信息,请参阅 头部增强器

MongoDB 支持:新的 ConfigurableMongoDbMessageStore

除了现有的 eMongoDbMessageStore,我们引入了一个新的 ConfigurableMongoDbMessageStore。这为 MongoDB 提供了更健壮和灵活的 MessageStore 实现。它与现有存储不向后兼容,但我们建议将其用于新应用程序。现有应用程序可以使用它,但旧存储中的消息不可用。有关更多信息,请参阅 MongoDb 支持

Syslog 支持

在 2.2 SyslogToMapTransformer 的基础上,Spring Integration 3.0 引入了专门用于接收 SYSLOG 消息的 UDPTCP 入站通道适配器。有关更多信息,请参阅 Syslog 支持

tail 支持

我们添加了文件入站通道适配器,它们使用 tail 命令在文本文件末尾添加行时生成消息。请参阅 'tail’ing 文件

JMX 支持

我们添加了 <int-jmx:tree-polling-channel-adapter/>。此适配器查询 JMX MBean 树,并发送一个消息,其有效负载是与查询匹配的对象图。默认情况下,MBean 映射到原语和简单对象(例如 MapList 和数组)。它允许简单的转换,例如转换为 JSON。

IntegrationMBeanExporter 现在允许通过使用 naming-strategy 属性配置自定义 ObjectNamingStrategy

有关更多信息,请参阅 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 连接事件

入站通道适配器脚本支持

<int:inbound-channel-adapter/> 现在支持使用 <expression/><script/> 子元素来创建 MessageSource。请参阅 通道适配器表达式和脚本

内容增强器:头部增强支持

内容增强器现在提供 <header/> 子元素的配置,以根据来自底层消息流的回复消息来增强出站消息的头部。有关更多信息,请参阅 有效负载增强器

一般性更改

本节描述了从 2.2 版到 3.0 版的一般性更改。

消息 ID 生成

以前,消息 ID 是使用 JDK UUID.randomUUID() 方法生成的。在此版本中,默认机制已更改为使用更高效且显著更快的算法。此外,我们增加了更改用于生成消息 ID 的策略的能力。有关更多信息,请参阅 消息 ID 生成

“<gateway>” 更改

您现在可以跨所有网关方法设置通用头部,并且我们添加了更多选项来向消息添加有关调用了哪个方法的信息。

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

GatewayMethodMetadata 现在是一个公共类。它允许您从 Java 以编程方式配置 GatewayProxyFactoryBean

有关更多信息,请参阅 消息网关

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-SinceIf-Unmodified-Since HTTP 头部: 以前,If-Modified-SinceIf-Unmodified-Since HTTP 头部在 DefaultHttpHeaderMapper 中映射的 HTTP 头部之间处理不正确。现在,除了纠正这个问题之外,DefaultHttpHeaderMapper 还为任何接受日期时间值的 HTTP 头部提供了从格式化字符串进行日期解析的功能。

  • 入站端点表达式变量: 除了现有的 #requestParams#pathVariables<http:inbound-gateway/><http:inbound-channel-adapter/> 现在支持额外的有用变量:#matrixVariables#requestAttributes#requestHeaders#cookies。这些变量在有效负载和头部表达式中都可用。

  • 出站端点 'uri-variables-expression': HTTP 出站端点现在支持 uri-variables-expression 属性,以指定一个 Expression 来评估 URL 模板中所有 URI 变量占位符的 Map。这允许根据出站消息选择不同的表达式映射。

有关更多信息,请参阅 HTTP 支持

Jackson 支持 (JSON)

  • 引入了一种新的 JSON 转换抽象。目前提供了 Jackson 1.x 和 Jackson 2 的实现,版本由类路径上的存在决定。以前,只支持 Jackson 1.x。

  • ObjectToJsonTransformerJsonToObjectTransformer 现在发出/消费包含类型信息的头部。

有关更多信息,请参阅 转换器 中的 “JSON 转换器”。

链元素 id 属性

以前,<chain> 中元素的 id 属性被忽略,在某些情况下甚至被禁止。现在,<chain> 中所有元素都允许使用 id 属性。链元素的 bean 名称是周围链的 id 和元素本身 id 的组合。例如:'myChain$child.myTransformer.handler'。有关更多信息,请参阅 消息处理程序链

聚合器 'empty-group-min-timeout' 属性

AbstractCorrelatingMessageHandler 提供了一个名为 empty-group-min-timeout 的新属性,允许空组过期以比过期部分组更长的时间表运行。空组在至少此毫秒数内未被修改之前不会从 MessageStore 中删除。有关更多信息,请参阅 使用 XML 配置聚合器

持久文件列表过滤器(文件,(S)FTP)

现在可以使用使用持久 MetadataStore 的新 FileListFilter 实现。您可以使用它们来防止系统重启后出现重复文件。有关更多信息,请参阅 读取文件FTP 入站通道适配器SFTP 入站通道适配器

脚本支持:变量更改

我们为脚本组件引入了一个新的 variables 属性。此外,现在允许内联脚本进行变量绑定。有关更多信息,请参阅 Groovy 支持脚本支持

Direct Channel 负载均衡配置

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

PublishSubscribeChannel 行为

以前,发送到没有订阅者的 <publish-subscribe-channel/> 会返回 false 结果。如果与 MessagingTemplate 结合使用,这将导致抛出异常。现在,PublishSubscribeChannel 有一个名为 minSubscribers 的属性(默认值:0)。如果消息发送到至少最小数量的订阅者,则发送操作被认为是成功的(即使数量为零)。如果应用程序期望在这些条件下获得异常,请将最小订阅者设置为至少 1。

FTP、SFTP 和 FTPS 更改

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

我们从所有端点中删除了已弃用的 cached-sessions 属性。以前,由该属性值控制的嵌入式缓存机制无法限制缓存的大小,缓存可能会无限增长。2.1 版引入了 CachingConnectionFactory,它成为缓存会首选(现在是唯一)方式。

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

DefaultSftpSessionFactory(与 CachingSessionFactory 结合使用)现在支持通过单个 SSH 连接(仅限 SFTP)复用通道。

FTP、SFTP 和 FTPS 入站适配器

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

在此版本中,一个新属性 local-filter 允许您覆盖默认过滤器(例如,使用 AcceptAllFileListFilter 或其他一些自定义过滤器)。

如果您希望 AcceptOnceFileListFilter 的行为在 JVM 执行之间保持不变,您现在可以配置一个保留状态的自定义过滤器,可能在文件系统上。

入站通道适配器现在支持 preserve-timestamp 属性,该属性将本地文件修改时间戳设置为服务器上的时间戳(默认值:false)。

FTP、SFTP 和 FTPS 网关

网关现在支持 mv 命令,允许重命名远程文件。

网关现在支持递归 lsmget 命令,允许检索远程文件树。

网关现在支持 putmput 命令,允许将文件发送到远程服务器。

现在支持 local-filename-generator-expression 属性,允许在检索期间命名本地文件。默认情况下,使用与远程文件相同的名称。

现在支持 local-directory-expression 属性,允许在检索期间命名本地目录(基于远程目录)。

远程文件模板

FTP 和 SFTP 模块使用的 Session 实现之上提供了一个新的更高级别的抽象 (RemoteFileTemplate)。虽然它在内部由端点使用,但您也可以以编程方式使用此抽象。与所有 Spring *Template 实现一样,它可靠地关闭底层会话,同时允许对会话进行低级访问。

有关更多信息,请参阅 FTP/FTPS 适配器SFTP 适配器

出站网关的 'requires-reply' 属性

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

WebService 出站网关有一个额外的属性,名为 ignore-empty-responses。它用于将空 String 响应视为未收到响应。默认情况下,它为 true,但您可以将其设置为 false,以允许应用程序在回复消息有效负载中接收空 String。当属性为 true 时,空字符串被视为没有响应,以便用于 requires-reply 属性。默认情况下,WebService 出站网关的 requires-reply 为 false。

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

以前,网关如果未收到回复,会静默结束流(并带有 DEBUG 日志消息)。默认情况下,此更改后,大多数网关现在会抛出异常。要恢复到以前的行为,请将 requires-reply 设置为 false

AMQP 出站网关头部映射

以前,<int-amqp:outbound-gateway/> 在调用消息转换器之前映射头部,并且转换器可以覆盖诸如 content-type 之类的头部。出站适配器在转换之后映射头部,这意味着使用来自出站 Message 的头部(如果存在),例如 content-type

从这个版本开始,网关现在在消息转换之后映射头部,这与适配器一致。如果您的应用程序依赖于以前的行为(其中转换器的头部覆盖了映射的头部),您需要过滤这些头部(在消息到达网关之前)或适当地设置它们。受 SimpleMessageConverter 影响的头部是 content-typecontent-encoding。自定义消息转换器可能会设置其他头部。

存储过程组件改进

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

  • type-name

  • return-type

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

有关更多信息,请参阅 存储过程

Web 服务出站 URI 配置

Web 服务出站网关的 'uri' 属性现在支持 Spring Web Services 支持的所有 URI 方案的 <uri-variable/> 替换。有关更多信息,请参阅 出站 URI 配置

Redis 适配器更改

Redis 入站通道适配器现在可以将 serializer 属性设置为 null 值,原始数据作为消息有效负载。

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

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

有关更多信息,请参阅 Redis 支持

建议过滤器

以前,当 <filter/> 具有 <request-handler-advice-chain/> 时,丢弃操作都在建议链的范围内执行(包括 discard-channel 上的任何下游流)。过滤器元素现在有一个名为 discard-within-advice 的属性(默认值:true),允许在建议链完成后执行丢弃操作。请参阅 建议过滤器

使用注解建议端点

请求处理程序建议链现在可以使用注解进行配置。请参阅 使用注解建议端点

ObjectToStringTransformer 改进

此转换器现在可以正确地将 byte[]char[] 有效负载转换为 String。有关更多信息,请参阅 转换器

JPA 支持更改

要持久化或合并的有效负载现在可以是 java.lang.Iterable 类型。

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

JPA 适配器现在具有附加属性,用于在执行持久化操作后,选择性地刷新和清除关联持久化上下文中的实体。

检索网关没有机制来指定要检索的第一个记录,这是一个常见的用例。检索网关现在通过向网关定义添加 first-resultfirst-result-expression 属性来支持指定此参数。有关更多信息,请参阅 检索出站网关

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

有关更多信息,请参阅 JPA 支持

延迟器:延迟表达式

以前,<delayer> 提供了一个 delay-header-name 属性,用于在运行时确定延迟值。在复杂情况下,<delayer> 必须前面有一个 <header-enricher>。Spring Integration 3.0 引入了 expression 属性和 expression 子元素,用于动态延迟确定。delay-header-name 属性现在已弃用,因为您可以在 expression 中指定头部评估。此外,我们引入了 ignore-expression-failures 来控制表达式评估失败时的行为。有关更多信息,请参阅 延迟器

JDBC 消息存储改进

Spring Integration 3.0 增加了一组新的 MySQL 5.6.4 及更高版本的 DDL 脚本。现在 MySQL 支持小数秒,从而在从基于 MySQL 的消息存储轮询时改进了 FIFO 排序。有关更多信息,请参阅 通用 JDBC 消息存储

IMAP 空闲连接异常

以前,如果 IMAP 空闲连接失败,会记录日志,但没有机制通知应用程序。此类异常现在会生成 ApplicationEvent 实例。应用程序可以通过使用 <int-event:inbound-channel-adapter> 或任何配置为接收 ImapIdleExceptionEvent(或其超类之一)的 ApplicationListener 来获取这些事件。

消息头部和 TCP

TCP 连接工厂现在支持配置灵活的机制,通过 TCP 传输选定的头部(以及有效负载)。新的 TcpMessageMapper 允许选择头部,您需要配置适当的序列化器或反序列化器将生成的 Map 写入 TCP 流。我们添加了 MapJsonSerializer 作为一种方便的机制,通过 TCP 传输头部和有效负载。有关更多信息,请参阅 传输头部

JMS 消息驱动通道适配器

以前,在配置 <message-driven-channel-adapter/> 时,如果您希望使用特定的 TaskExecutor,则必须声明一个容器 bean,并通过设置 container 属性将其提供给适配器。我们添加了 task-executor,允许直接在适配器上设置。这除了已经可用的其他几个容器属性之外。

XsltPayloadTransformer

您现在可以通过设置 transformer-factory-class 属性来指定转换器工厂类名。请参阅 XsltPayloadTransformer