2.2 和 3.0 之间的变更
新组件
版本 3.0 添加了许多新组件。
HTTP 请求映射
HTTP 模块现在为入站端点提供了强大的请求映射支持。我们用 IntegrationRequestMappingHandlerMapping
类替换了 UriPathHandlerMapping
类,该类在应用程序上下文中以 integrationRequestMappingHandlerMapping
的 bean 名称注册。在解析 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 列表执行 '右弹出' 和 '左推送' 操作。
有关更多信息,“请参阅 Redis 支持”。
Header Channel 注册表
你现在可以指示框架将回复通道和错误通道存储在注册表中,以便稍后解析。这在 replyChannel
或 errorChannel
可能会丢失的情况下很有用(例如,在序列化消息时)。更多信息,请参阅 Header Enricher。
MongoDB 支持:新的 ConfigurableMongoDbMessageStore
除了现有的 eMongoDbMessageStore
,我们引入了一个新的 ConfigurableMongoDbMessageStore
。这为 MongoDB 提供了更强大和灵活的 MessageStore
实现。它与现有的存储不向后兼容,但我们建议在新应用中使用它。现有应用可以使用它,但旧存储中的消息将不可用。更多信息,请参见 MongoDb 支持。
Syslog 支持
基于 2.2 SyslogToMapTransformer
,Spring Integration 3.0 引入了专门用于接收 SYSLOG 消息的 UDP
和 TCP
入站通道适配器。有关更多信息,请参阅 Syslog Support。
tail
支持
我们添加了文件入站通道适配器,使用 tail
命令在文本文件末尾添加行时生成消息。详见‘tail’ 文件。
JMX 支持
我们添加了 <int-jmx:tree-polling-channel-adapter/>
。此适配器查询 JMX MBean 树,并发送一条消息,消息的有效负载是与查询匹配的对象图。默认情况下,MBeans 被映射到原始类型和简单对象(如 Map
、List
和数组)。它允许进行简单的转换,例如转换为 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
。详情请参阅 Channel Adapter Expressions and Scripts。
内容丰富器:标题丰富支持
内容丰富器现在提供配置 <header/>
子元素,以根据底层消息流的回复消息为 outbound 消息添加标题。有关更多信息,请参见 有效负载丰富器。
通用更改
此部分描述了从版本 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-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
、#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。
-
ObjectToJsonTransformer
和JsonToObjectTransformer
现在发出/消耗包含类型信息的头信息。
有关详细信息,请参阅 Transformer 中的“JSON 转换器”。
链元素 id
属性
在链子组件中,id
属性用于唯一标识各个子组件。每个链子组件的 id
应该是唯一的,以便于管理和引用。
以前,<chain>
内的元素的 id
属性被忽略,在某些情况下甚至不允许。现在,id
属性允许用于 <chain>
内的所有元素。链元素的bean名称是外部链的 id
和元素本身的 id
的组合。例如:'myChain$child.myTransformer.handler'。有关更多信息,请参阅 消息处理程序链。
聚合器 'empty-group-min-timeout' 属性
AbstractCorrelatingMessageHandler
提供了一个名为 empty-group-min-timeout
的新属性,以允许空组过期在一个比部分组过期更长的时间表上运行。空组在至少未被修改这个数量的毫秒之前不会从 MessageStore
中移除。有关更多信息,请参阅 使用 XML 配置聚合器。
持久文件列表过滤器 (文件,(S)FTP)
现在提供了使用持久化 MetadataStore
的新 FileListFilter
实现。您可以使用这些实现来防止系统重启后出现重复文件。更多信息,请参见 读取文件、FTP 入站通道适配器 和 SFTP 入站通道适配器。
脚本支持:变量更改
直接通道负载均衡配置
之前,在通道的 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
或其他自定义过滤器)。
如果你想在 JVM 执行之间保持 AcceptOnceFileListFilter
的行为,现在你可以配置一个自定义过滤器来保留状态,也许是在文件系统上。
入站通道适配器现在支持 preserve-timestamp
属性,该属性将本地文件的修改时间戳设置为服务器的时间戳(默认值:false
)。
FTP、SFTP 和 FTPS 网关
网关现在支持 mv
命令,可以重命名远程文件。
网关现在支持递归的 ls
和 mget
命令,能够检索远程文件树。
网关现在支持 put
和 mput
命令, enables sending files to the remote server.
修正为:
网关现在支持 put
和 mput
命令,能够将文件发送到远程服务器。
local-filename-generator-expression
属性现在已被支持,可以在检索期间命名本地文件。默认情况下,使用与远程文件相同的名称。
现在支持 local-directory-expression
属性, enables 在检索期间基于远程目录命名本地目录。
修正后:
现在支持 local-directory-expression
属性,能够在检索期间根据远程目录来命名本地目录。
远程文件模板
提供了一个新的更高层次的抽象 (RemoteFileTemplate
),它位于 FTP 和 SFTP 模块使用的 Session
实现之上。虽然它在内部被端点使用,但您也可以程序化地使用这个抽象。与所有 Spring *Template
实现一样,它可靠地关闭底层会话,同时允许对会话进行低级别访问。
有关更多信息,请参阅 FTP/FTPS 适配器 和 SFTP 适配器。
'requires-reply' 属性用于出站网关
所有出站网关(如 <jdbc:outbound-gateway/>
或 <jms:outbound-gateway/>
)都设计用于“请求-回复”场景。期望从外部服务获得响应,并将其发布到 reply-channel
或 replyChannel
消息头。但是,有些情况下外部系统可能不会总是返回结果(例如,<jdbc:outbound-gateway/>
在 SELECT 结束时返回一个空的 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 命名空间在 outbound gateways 上配置它。
之前,网关在收不到回复时会默默地结束流程(带有 DEBUG 日志消息)。通过此更改,默认情况下,大多数网关现在会抛出异常。要恢复到以前的行为,将 requires-reply
设置为 false
。
AMQP 外发网关头映射
之前,<int-amqp:outbound-gateway/> 在调用消息转换器之前会映射头信息,而转换器可能会覆盖诸如 content-type
的头信息。 outbound 适配器在转换之后映射头信息,这意味着来自 outbound Message
(如果存在)的头信息如 content-type
将被使用。
从这个版本开始,网关现在在消息转换之后映射头信息,这与适配器的行为一致。如果您的应用程序依赖于以前的行为(其中转换器的头信息覆盖了映射的头信息),您需要在消息到达网关之前过滤这些头信息,或者适当地设置它们。SimpleMessageConverter
影响的头信息是 content-type
和 content-encoding
。自定义消息转换器可能会设置其他头信息。
存储过程组件改进
对于标准 CallableStatement.getObject
方法不支持的更复杂的数据库特定类型,我们在具有 OUT 方向的 <sql-parameter-definition/>
元素中引入了两个新的附加属性:
-
type-name
-
return-type
存储过程传入通道适配器的 row-mapper
属性 <returning-resultset/>
子元素现在支持引用一个 RowMapper
bean 定义。以前,它只包含一个类名(这仍然被支持)。
有关详细信息,请参阅 存储过程。
Web Service 外发 URI 配置
Web 服务 outbound 网关的 uri
属性现在支持为 Spring Web Services 支持的所有 URI 方案进行 <uri-variable/>
替换。有关更多信息,请参阅Outbound URI 配置。
Redis 适配器更改
现在 Redis 入站通道适配器可以为 serializer
属性使用 null
值,原始数据将作为消息有效负载。
现在 Redis outbound 通道适配器具有 topic-expression
属性,用于在运行时确定 Redis 主题以发送 Message
。
Redis 入站通道适配器,除了现有的 topics
属性外,现在还有了 topic-patterns
属性。
有关更多信息,请参阅 Redis 支持。
建议过滤器
之前,当一个 <filter/>
拥有 <request-handler-advice-chain/>
时,丢弃操作完全在建议链的作用范围内执行(包括任何 discard-channel
上的下游流程)。现在,过滤器元素有了一个名为 discard-within-advice
(默认值:true
)的属性,允许在建议链完成后执行丢弃操作。请参阅 建议过滤器。
使用注解建议端点
现在可以使用注解配置请求处理器建议链。见使用注解建议端点。
ObjectToStringTransformer 改进
此转换器现在可以正确地将 byte[]
和 char[]
负载转换为 String
。有关更多信息,请参阅转换器。
JPA 支持变更
可以持久化或合并的有效负载现在可以是类型 [java.lang.Iterable](https://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html)
。
在这种情况下,Iterable
返回的每个对象都被视为一个实体,并使用底层的 EntityManager
进行持久化或合并。迭代器返回的空值将被忽略。
JPA 适配器现在具有额外的属性,可以在执行持久化操作后,选择性地刷新和清除关联的持久化上下文中的实体。
检索网关以前没有机制来指定要检索的第一条记录,这是一种常见的用例。现在,检索网关支持通过在网关定义中添加 first-result
和 first-result-expression
属性来指定此参数。有关更多信息,请参阅 检索 outbound Gateway。
JPA 检索网关和入站适配器现在有一个属性,可以通过表达式指定结果集中结果的最大数量。此外,我们引入了 max-results
属性来替换已弃用的 max-number-of-results
。max-results
和 max-results-expression
分别用于提供结果集中的最大结果数量或计算最大结果数量的表达式。
有关更多信息,请参见 JPA 支持。
延迟器:延迟表达式
以前,<delayer>
提供了 delay-header-name
属性来在运行时确定延迟值。在复杂情况下,<delayer>
必须与一个 <header-enricher>
配合使用。Spring Integration 3.0 引入了 expression
属性和 expression
子元素,用于动态确定延迟。delay-header-name
属性现已弃用,因为您可以在 expression
中指定头评估。此外,我们引入了 ignore-expression-failures
来控制表达式评估失败时的行为。有关更多信息,请参阅 Delayer。
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](xml/transformation.md#xml-xslt-payload-transformers)
。