|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
2.2 与 3.0 之间的变更
新组件
版本 3.0 添加了许多新组件。
HTTP 请求映射
HTTP 模块现在为入站端点提供了强大的请求映射支持。
我们将 UriPathHandlerMapping 类替换为 IntegrationRequestMappingHandlerMapping,该 bean 在应用上下文中以 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 属性访问器支持
为了使用 PropertyAccessor 实现自定义 SpEL EvaluationContext,我们添加了 <spel-property-accessors/> 组件。
更多信息,请参阅 属性访问器。
Redis: 新组件
我们添加了一个基于 Redis 的 MetadataStore 实现。
您可以使用 RedisMetadataStore 在应用程序重启之间维护 MetadataStore 的状态。
这个新的 MetadataStore 实现可以与适配器一起使用,例如:
-
Twitter 入站适配器
-
传入通道适配器
我们新增了基于队列的组件。
我们为 Redis List 分别添加了 <int-redis:queue-inbound-channel-adapter/> 和 <int-redis:queue-outbound-channel-adapter/> 组件,以执行“右弹出”和“左压入”操作。
有关更多信息,请“参见 Redis 支持”。
头部通道注册表
您现在可以指示框架将回复通道和错误通道存储在注册表中,以便稍后解析。
这在replyChannel或errorChannel可能丢失的情况下非常有用(例如,在序列化消息时)。
有关更多信息,请参阅Header Enricher。
MongoDB 支持:新ConfigurableMongoDbMessageStore
除了现有的 eMongoDbMessageStore,我们还引入了一个新的 ConfigurableMongoDbMessageStore。
这为 MongoDB 提供了更健壮且灵活的 MessageStore 实现方案。
它与现有存储不向后兼容,但我们建议在新应用中使用它。
现有应用也可以使用它,但旧存储中的消息将无法访问。
有关更多信息,请参阅 MongoDB 支持。
Syslog 支持
基于 2.2 SyslogToMapTransformer,Spring Integration 3.0 引入了 UDP 和 TCP 入站通道适配器,特别针对接收 SYSLOG 消息进行了优化。
更多信息,请参阅 SYSLOG 支持。
tail支持
我们添加了使用 tail 命令在文本文件末尾添加行时生成消息的文件入站通道适配器。
参见 'tail'ing Files。
JMX 支持
我们添加了 <int-jmx:tree-polling-channel-adapter/>。
此适配器查询 JMX MBean 树,并发送一条消息,其负载为与查询匹配的对象图。
默认情况下,MBeans 被映射为基本类型和简单对象(例如 Map、List 以及数组)。
它允许简单的转换,例如转换为 JSON。
The 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 连接事件。
入站通道适配器脚本支持
The <int:inbound-channel-adapter/> now supports using <expression/> and <script/> child elements to create a MessageSource.
See 通道适配器表达式和脚本。
内容增强器:请求头增强支持
内容增强器现在提供配置以支持 <header/> 个子元素,用于基于底层消息流的回复消息,通过标头来丰富出站消息。
更多信息请参阅 负载增强器。
常规变更
本节描述了从 2.2 版本到 3.0 版本的一般性变更。
消息 ID 生成
此前,消息 ID 是使用 JDK UUID.randomUUID() 方法生成的。
本次发布中,默认机制已更改为使用更高效且速度显著提升的算法。
此外,我们还添加了更改用于生成消息 ID 的策略的能力。
更多信息请参见 消息 ID 生成。
"网关"变更
您现在可以在所有网关方法中设置公共请求头,并且我们增加了更多选项,以便在消息中添加关于已调用的方法的更多信息。
您现在可以完全自定义网关方法调用如何映射到消息的方式。
The GatewayMethodMetadata is now a public class.
It lets you programmatically configure the GatewayProxyFactoryBean from Java.
有关更多信息,请参阅 消息网关。
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-SinceHTTP 请求头: 此前,If-Modified-Since和If-Unmodified-SinceHTTP 请求头在DefaultHttpHeaderMapper中映射的 from 和 to HTTP 请求头内被错误处理。 现在,除了修复该问题外,DefaultHttpHeaderMapper还为任何接受日期时间值的 HTTP 请求头提供了从格式化字符串进行日期解析的功能。 -
入站端点表达式变量: 除了现有的
#requestParams和#pathVariables之外,<http:inbound-gateway/>和<http:inbound-channel-adapter/>现在支持额外的有用变量:#matrixVariables,#requestAttributes,#requestHeaders, 和#cookies。 这些变量在负载(payload)和头部(header)表达式中均可用。 -
出站端点 'uri-variables-expression': HTTP 出站端点现在支持
uri-variables-expression属性,用于指定一个Expression来评估 URL 模板中所有 URI 变量占位符的Map。 这允许根据传出消息选择不同的表达式映射。
有关更多信息,请参阅 HTTP 支持。
Jackson 支持 (JSON)
-
引入了用于 JSON 转换的新抽象。 当前提供了 Jackson 1.x 和 Jackson 2 的实现,具体版本由类路径中的存在情况决定。 此前仅支持 Jackson 1.x。
-
The
ObjectToJsonTransformerandJsonToObjectTransformernow emit/consume headers containing type information.
有关更多信息,请参见转换器中的“JSON 转换器”。
链式元素id属性
此前,id 属性在 <chain> 元素内会被忽略,在某些情况下甚至不被允许。
现在,id 属性允许用于 <chain> 内的所有元素。
链元素的 Bean 名称由外围链的 id 与元素自身的 id 组合而成。
例如:'myChain$child.myTransformer.handler'。
更多信息请参见,消息处理器链。
聚合器 'empty-group-min-timeout' 属性
The AbstractCorrelatingMessageHandler 提供了一个新属性 empty-group-min-timeout,允许空组过期以比部分组过期更长的调度运行。
空组在至少未修改此数量的毫秒之前不会从 MessageStore 中移除。
更多信息,请参阅 使用 XML 配置聚合器。
持久化文件列表过滤器(file, (S)FTP)
现在已提供使用持久化MetadataStore的新FileListFilter实现。
您可以使用这些实现来防止系统重启后出现重复文件。
有关更多信息,请参阅读取文件、FTP 入站通道适配器以及SFTP 入站通道适配器。
直接通道负载均衡配置
此前,当在通道的 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 属性。
此前,由该属性值控制的嵌入式缓存机制无法限制缓存大小,可能导致缓存无限增长。
2.1 版本引入了 CachingConnectionFactory,它已成为首选(且现在是唯一)的会话缓存方式。
CachingConnectionFactory 现在提供了一个新方法:resetCache()。
此方法会立即关闭空闲会话,并在会话返回缓存时关闭正在使用的会话。
The DefaultSftpSessionFactory(与 CachingSessionFactory 配合)现在支持在单个 SSH 连接上复用通道(仅限 SFTP)。
FTP、SFTP 和 FTPS 入站适配器
此前,没有方法可以覆盖用于处理从远程服务器检索的文件的默认过滤器。
filter属性决定检索哪些文件,但FileReadingMessageSource使用AcceptOnceFileListFilter。
这意味着,如果以与先前复制的文件相同的名称检索新副本,则适配器不会发送任何消息。
在此版本中,新增属性 local-filter 允许您覆盖默认过滤器(例如,使用 AcceptAllFileListFilter 或其他自定义过滤器)。
如果您希望 AcceptOnceFileListFilter 的行为在 JVM 执行之间得以保持,您现在可以配置一个自定义过滤器来保留状态,例如在文件系统中。
入站通道适配器现在支持 preserve-timestamp 属性,该属性将本地文件的修改时间戳设置为来自服务器的时间戳(默认值:false)。
FTP、SFTP 和 FTPS 网关
网关现在支持 mv 命令,从而能够重命名远程文件。
网关现在支持递归 ls 和 mget 命令,从而能够获取远程文件树。
网关现在支持 put 和 mput 命令,允许向远程服务器发送文件。
现在支持 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-channel 或 replyChannel 消息头中。
然而,在某些情况下,外部系统可能不会始终返回结果(例如,
当 SELECT 语句以空 ResultSet 结束时,或者是一个单向 Web 服务时,会出现 <jdbc:outbound-gateway/>)。
因此,开发人员需要一个选项来配置是否必须等待回复。
为此,我们引入了 requires-reply 属性供出站网关组件使用。
在大多数情况下,requires-reply 的默认值为 true。
如果没有结果,将抛出 ReplyRequiredException。
将其值更改为 false 意味着,如果外部服务未返回任何内容,则消息流将在该点结束,类似于出站通道适配器。
WebService 出站网关具有一个名为 ignore-empty-responses 的附加属性。
它用于将空的 String 响应视为未收到任何响应。
默认情况下,它的值为 true,但您可以将其设置为 false,以便应用程序能够在回复消息负载中接收空 String。
当该属性为 true 时,在 requires-reply 属性的上下文中,空字符串被视为无响应。
默认情况下,requires-reply 对于 WebService 出站网关为 false。 |
请注意,requiresReply属性之前存在但在AbstractReplyProducingMessageHandler中被设置为false,并且无法通过XML命名空间在出站网关中配置该属性。
以前,未收到回复的网关会静默结束流程(附带一条 DEBUG 级别日志消息)。
默认情况下,通过此更改,大多数网关现在将抛出异常。
若要恢复之前的行为,请将 requires-reply 设置为 false。 |
AMQP 出站网关头映射
此前,<int-amqp:outbound-gateway/>在调用消息转换器之前会映射头信息,且转换器可能会覆盖诸如content-type之类的头信息。
而出站适配器则在转换之后映射头信息,这意味着将使用出站Message(如果存在)中的content-type等头信息。
从本版本开始,网关现在在消息转换之后映射请求头,与适配器保持一致。
如果您的应用依赖于之前的行为(即转换器的请求头会覆盖已映射的请求头),则需要过滤这些请求头(在消息到达网关之前)或正确设置它们。
受 SimpleMessageConverter 影响的请求头是 content-type 和 content-encoding。
自定义消息转换器可能会设置其他请求头。
存储过程组件改进
对于标准 CallableStatement.getObject 方法不支持的更复杂的数据库特定类型,我们为带有 OUT 方向的 <sql-parameter-definition/> 元素引入了两个新的附加属性:
-
type-name -
return-type
存储过程入站通道适配器 <returning-resultset/> 子元素的 row-mapper 属性现在支持引用 RowMapper Bean 定义。
此前,它仅包含类名(该方式仍受支持)。
有关更多信息,请参见 存储过程。
Web 服务出站 URI 配置
Web 服务出站网关的 'uri' 属性现在支持使用 <uri-variable/> 进行替换,适用于 Spring Web Services 支持的所有 URI 方案。
更多信息,请参见 出站 URI 配置。
Redis 适配器变更
Redis 入站通道适配器现在可以为 serializer 属性使用 null 值,此时原始数据即为消息负载。
Redis 出站通道适配器现在拥有 topic-expression 属性,用于在运行时确定 Redis 主题的 Message。
Redis 入站通道适配器除了现有的 topics 属性外,现在还具有 topic-patterns 属性。
有关更多信息,请参阅 Redis 支持。
顾问过滤器
以前,当 <filter/> 具有 <request-handler-advice-chain/> 时,丢弃操作完全在通知链(包括 discard-channel 上的任何下游流程)范围内执行。
filter 元素现在有一个名为 discard-within-advice 的属性(默认值:true),允许在通知链完成后执行丢弃操作。
请参阅 Advising Filters。
使用注解建议端点
请求处理程序建议链现在可以使用注解进行配置。 请参见 使用注解建议端点。
ObjectToStringTransformer 改进
此转换器现在能正确地将 byte[] 和 char[] 负载转换为 String。
更多信息,请参见 转换器。
JPA 支持变更
现在,用于持久化或合并的载荷可以是java.lang.Iterable类型。
在这种情况下,由 Iterable 返回的每个对象都被视为实体,并使用底层的 EntityManager 进行持久化或合并。
迭代器返回的空值将被忽略。
JPA 适配器现在具有额外的属性,用于在执行业务持久化操作后选择性地刷新和清除关联持久性上下文中的实体。
检索网关此前没有机制指定要检索的第一条记录,而这是一种常见的使用场景。
现在,检索网关支持通过在网关定义中添加 first-result 和 first-result-expression 属性来指定此参数。
更多信息,请参阅 检索出站网关。
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。