2.2 和 3.0 之间的更改
新组件
版本 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 Expression Language (SpEL) 配置
我们添加了一个新的 IntegrationEvaluationContextFactoryBean,允许配置自定义 PropertyAccessor 实现和函数,以便在整个框架的 SpEL 表达式中使用。有关更多信息,请参阅Spring Expression Language (SpEL)。
SpEL 函数支持
为了使用静态 Method 函数自定义 SpEL EvaluationContext,我们引入了 <spel-function/> 组件。我们还添加了两个内置函数:#jsonPath 和 #xpath。有关更多信息,请参阅SpEL 函数。
SpEL PropertyAccessor 支持
为了使用 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 Registry
您现在可以指示框架将回复通道和错误通道存储在注册表中,以便稍后解析。这对于 replyChannel 或 errorChannel 可能丢失的情况(例如,序列化消息时)很有用。有关更多信息,请参阅消息头增强器。
MongoDB 支持:新的 ConfigurableMongoDbMessageStore
除了现有的 eMongoDbMessageStore,我们还引入了一个新的 ConfigurableMongoDbMessageStore。这为 MongoDB 提供了更健壮、更灵活的 MessageStore 实现。它与现有存储不向后兼容,但我们建议在新应用程序中使用它。现有应用程序可以使用它,但旧存储中的消息将不可用。有关更多信息,请参阅MongoDb 支持。
Syslog 支持
在 2.2 SyslogToMapTransformer 的基础上,Spring Integration 3.0 引入了专门用于接收 SYSLOG 消息的 UDP 和 TCP 入站通道适配器。有关更多信息,请参阅Syslog 支持。
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。请参阅通道适配器表达式和脚本。
内容增强器:消息头增强支持
内容增强器现在提供 <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-Since和If-Unmodified-SinceHTTP 消息头: 以前,If-Modified-Since和If-Unmodified-SinceHTTP 消息头在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现在发出/使用包含类型信息的消息头。
有关更多信息,请参阅转换器中的“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 入站通道适配器。
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 命令,从而可以重命名远程文件。
网关现在支持递归 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 消息头。但是,在某些情况下,外部系统可能不总是返回结果(例如,<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 命名空间在出站网关上配置它。
以前,没有收到回复的网关会静默结束流(并带有 DEBUG 日志消息)。默认情况下,在此更改后,大多数网关现在会抛出异常。要恢复到以前的行为,请将 requires-reply 设置为 false。 |
AMQP 出站网关消息头映射
以前,<int-amqp:outbound-gateway/> 在调用消息转换器之前映射消息头,转换器可能会覆盖 content-type 等消息头。出站适配器在转换后映射消息头,这意味着使用出站 Message 中的 content-type 等消息头(如果存在)。
从这个版本开始,网关现在在消息转换后映射消息头,与适配器保持一致。如果您的应用程序依赖于以前的行为(转换器的消息头覆盖了映射的消息头),您需要过滤这些消息头(在消息到达网关之前)或适当设置它们。受 SimpleMessageConverter 影响的消息头是 content-type 和 content-encoding。自定义消息转换器可能会设置其他消息头。
存储过程组件改进
对于标准 CallableStatement.getObject 方法不支持的更复杂的数据库特定类型,我们为具有 OUT-direction 的 <sql-parameter-definition/> 元素引入了两个新的附加属性:
-
类型名称 -
返回类型
存储过程入站通道适配器 <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/> 时,丢弃操作完全在 advice chain 的范围内执行(包括 discard-channel 上的任何下游流)。filter 元素现在有一个名为 discard-within-advice 的属性(默认值:true),允许在 advice chain 完成后执行丢弃操作。请参阅通知过滤器。
使用注解通知端点
请求处理程序通知链现在可以使用注解进行配置。请参阅使用注解通知端点。
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 来控制表达式评估失败时的行为。有关更多信息,请参阅延迟器。
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。