对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
2.2 和 3.0 之间的更改
新组件
3.0 版添加了许多新组件。
HTTP 请求映射
HTTP 模块现在为入站端点提供强大的请求映射支持。
我们将UriPathHandlerMapping
类与IntegrationRequestMappingHandlerMapping
,以integrationRequestMappingHandlerMapping
在应用程序上下文中。
解析 HTTP 入站端点时,新的IntegrationRequestMappingHandlerMapping
Bean 已注册或现有 Bean 被重用。
为了实现灵活的请求映射配置,Spring Integration 提供了<request-mapping/>
child 元素的<http:inbound-channel-adapter/>
和<http:inbound-gateway/>
.
现在,两个 HTTP 入站端点都完全基于 Spring MVC 3.1 中引入的请求映射基础设施。
例如,单个入站终结点支持多个路径。
有关详细信息,请参阅 HTTP 命名空间支持。
Spring 表达式语言 (SpEL) 配置
我们添加了一个新的IntegrationEvaluationContextFactoryBean
允许配置自定义PropertyAccessor
在整个框架的 SpEL 表达式中使用的实现和函数。
有关更多信息,请参阅 Spring 表达式语言 (SpEL)。
SpEL 函数支持
自定义 SpELEvaluationContext
带静态Method
函数,我们引入了<spel-function/>
元件。
我们还添加了两个内置函数:#jsonPath
和#xpath
.
有关详细信息,请参阅 SpEL 函数。
SpEL PropertyAccessors 支持
自定义 SpELEvaluationContext
跟PropertyAccessor
实现时,我们添加了<spel-property-accessors/>
元件。
有关详细信息,请参阅属性访问器。
Redis:新组件
我们添加了一个新的基于 Redis 的MetadataStore
实现。
您可以使用RedisMetadataStore
以保持MetadataStore
跨应用程序重启。
这个新的MetadataStore
实现可以与适配器一起使用,例如:
-
Twitter 入站适配器
-
进站通道适配器
我们添加了新的基于队列的组件。
我们添加了<int-redis:queue-inbound-channel-adapter/>
和<int-redis:queue-outbound-channel-adapter/>
组件分别在 Redis List 上执行“右弹出”和“左推”作。
有关详细信息,“请参阅 Redis 支持”。
标头通道注册表
现在,您可以指示框架将回复通道和错误通道存储在注册表中,以便以后解决。
这对于以下情况很有用replyChannel
或errorChannel
可能会丢失(例如,在序列化消息时)。
有关详细信息,请参阅标头扩充器。
MongoDB 支持:新增ConfigurableMongoDbMessageStore
除了现有的eMongoDbMessageStore
,我们引入了一个新的ConfigurableMongoDbMessageStore
.
这提供了更健壮和灵活的实现MessageStore
对于 MongoDB。
它与现有商店没有向后兼容性,但我们建议将其用于新应用程序。
现有应用程序可以使用它,但旧存储中的消息不可用。
有关更多信息,请参阅 MongoDb 支持。
系统日志支持
基于 2.2SyslogToMapTransformer
,Spring Integration 3.0 引入UDP
和TCP
专为接收 SYSLOG 消息而定制的入站通道适配器。
有关详细信息,请参阅 Syslog 支持。
tail
支持
我们添加了文件入站通道适配器,这些适配器使用tail
命令在将行添加到文本文件末尾时生成消息。
参见“尾部”文件。
JMX 支持
我们添加了<int-jmx:tree-polling-channel-adapter/>
.
此适配器查询 JMX MBean 树并发送一条消息,其中包含有效负载,该有效负载是与查询匹配的对象的图形。
默认情况下,MBean 映射到原语和简单对象(例如Map
,List
和数组)。
它允许简单转换为 JSON。
这IntegrationMBeanExporter
现在允许配置自定义ObjectNamingStrategy
通过使用naming-strategy
属性。
有关更多信息,请参阅 JMX 支持。
TCP/IP 连接事件和连接管理
TcpConnection
实例现在发出ApplicationEvent
实例(具体来说TcpConnectionEvent
实例),当连接打开或关闭或发生异常时。
此更改允许应用程序使用普通的 Spring 通知应用程序对 TCP 连接的更改ApplicationListener
机制。
我们重命名AbstractTcpConnection
自TcpConnectionSupport
.
作为此类子类的自定义连接可以使用其方法发布事件。
同样,我们将AbstractTcpConnectionInterceptor
自TcpConnectionInterceptorSupport
.
此外,我们还添加了<int-ip:tcp-connection-event-inbound-channel-adapter/>
.
默认情况下,此适配器将所有TcpConnectionEvent
instances 到Channel
.
此外,TCP 连接工厂现在提供了一种名为getOpenConnectionIds()
,它返回所有打开连接的标识符列表。
它允许应用程序广播到所有打开的连接,以及其他用途。
最后,连接工厂还提供了一种名为closeConnection(String connectionId)
,它允许应用程序使用其 ID 显式关闭连接。
有关详细信息,请参阅 TCP 连接事件。
入站通道适配器脚本支持
这<int:inbound-channel-adapter/>
现在支持使用<expression/>
和<script/>
child 元素创建MessageSource
.
请参阅通道适配器表达式和脚本。
内容丰富器:标头扩充支持
内容扩充器现在提供<header/>
子元素,以根据基础消息流中的应答消息,使用标头扩充出站消息。
有关详细信息,请参阅有效负载扩充器。
一般更改
本节介绍从 2.2 版到 3.0 版的一般更改。
消息 ID 生成
以前,消息 ID 是使用 JDK 生成的UUID.randomUUID()
方法。
在此版本中,默认机制已更改为使用更高效、更快的算法。
此外,我们还添加了更改用于生成消息 ID 的策略的功能。
有关详细信息,请参阅消息 ID 生成。
“<网关>”更改
现在可以在所有网关方法中设置通用标头,并且我们添加了更多选项,用于向消息添加有关调用哪个方法的信息。
现在,您可以完全自定义网关方法调用映射到消息的方式。
这GatewayMethodMetadata
现在是一个公共课程。
它允许您以编程方式配置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
. 现在,除了纠正这个问题之外,DefaultHttpHeaderMapper
为任何接受日期时间值的 HTTP 标头提供格式化字符串的日期解析。 -
入站端点表达式变量:除了现有的
#requestParams
和#pathVariables
这<http:inbound-gateway/>
和<http:inbound-channel-adapter/>
现在支持其他有用的变量:#matrixVariables
,#requestAttributes
,#requestHeaders
和#cookies
. 这些变量在有效负载和标头表达式中都可用。 -
出站端点 'uri-variables-expression':HTTP 出站端点现在支持
uri-variables-expression
属性来指定Expression
要评估Map
对于 URL 模板中的所有 URI 变量占位符。 这允许根据传出消息选择不同的表达式映射。
有关详细信息,请参阅 HTTP 支持。
Jackson支持 (JSON)
-
引入了 JSON 转换的新抽象。 目前提供了 Jackson 1.x 和 Jackson 2 的实现,版本由类路径上的存在情况决定。 以前,仅支持 Jackson 1.x。
-
这
ObjectToJsonTransformer
和JsonToObjectTransformer
现在发出/使用包含类型信息的标头。
有关详细信息,请参阅 Transformer 中的“JSON Transformer”。
链元素id
属性
以前,id
属性<chain>
被忽视,在某些情况下,甚至被禁止。
现在,id
属性允许用于<chain>
.
链元素的 bean 名称是周围链的id
和id
元素本身。
例如:“myChain$child.myTransformer.handler”。
有关详细信息,请参阅消息处理程序链。
聚合器“empty-group-min-timeout”属性
这AbstractCorrelatingMessageHandler
提供了一个名为empty-group-min-timeout
以允许空组过期比过期的部分组更长的时间表运行。
空组不会从MessageStore
直到它们至少在这个毫秒数内没有被修改。
有关详细信息,请参阅使用 XML 配置聚合器。
持久文件列表过滤器(文件,(S)FTP)
新增功能FileListFilter
使用 persistentMetadataStore
现已上市。
您可以使用这些来防止系统重新启动后出现重复文件。
有关更多信息,请参阅读取文件、FTP 入站通道适配器和 SFTP 入站通道适配器。
直接通道负载平衡配置
以前,在配置LoadBalancingStrategy
在频道的dispatcher
child 元素,唯一可用的选项是使用预定义的值枚举,这不允许开发人员设置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
现在支持属性,从而在检索期间(基于远程目录)命名本地目录。
远程文件模板
一个新的更高级别的抽象 (RemoteFileTemplate
) 在Session
FTP 和 SFTP 模块使用的实现。
虽然它由端点在内部使用,但您也可以以编程方式使用此抽象。
像所有的Spring一样*Template
实现时,它可靠地关闭底层会话,同时允许对会话进行低级访问。
有关详细信息,请参阅 FTP/FTPS 适配器和 SFTP 适配器。
出站网关的“requires-reply”属性
所有出站网关(例如<jdbc:outbound-gateway/>
或<jms:outbound-gateway/>
) 专为“请求-回复”方案而设计。
外部服务需要响应,并发布到reply-channel
或replyChannel
message 标头。但是,在某些情况下,外部系统可能并不总是返回结果(例如, 一个<jdbc:outbound-gateway/>
当 SELECT 以空ResultSet
或者可能是单向 Web 服务)。
因此,开发人员需要一个选项来配置是否需要回复。
为此,我们引入了requires-reply
出站网关组件的属性。
在大多数情况下,默认值requires-reply
是true
.
如果没有结果,则ReplyRequiredException
被抛出。
将值更改为false
这意味着,如果外部服务未返回任何内容,那么消息流将在该点结束,类似于出站通道适配器。
WebService 出站网关有一个名为ignore-empty-responses .
它用于处理空的String 响应,就好像没有收到响应一样。
默认情况下,它是true ,但您可以将其设置为false 以允许应用程序接收空的String 在回复消息有效负载中。
当属性为true ,出于requires-reply 属性。
默认情况下,requires-reply 为 false。 |
请注意,requiresReply
属性以前存在,但设置为false
在AbstractReplyProducingMessageHandler
,并且无法使用 XML 命名空间在出站网关上配置它。
以前,未收到回复的网关将以静默方式结束流(并显示 DEBUG 日志消息)。
默认情况下,通过此更改,大多数网关现在都会引发异常。
要恢复到以前的行为,请将requires-reply 自false . |
AMQP 出站网关标头映射
以前,<int-amqp:outbound-gateway/>在调用消息转换器之前映射标头,转换器可以覆盖标头,例如content-type
.
出站适配器在转换后映射标头,这意味着像content-type
从出站Message
(如果存在)被使用。
从此版本开始,网关现在在消息转换后映射标头,与适配器一致。
如果应用程序依赖于以前的行为(其中转换器的标头覆盖映射的标头),则需要筛选这些标头(在消息到达网关之前)或适当地设置它们。
受SimpleMessageConverter
是content-type
和content-encoding
.
自定义消息转换器可能会设置其他标头。
存储过程组件改进
对于标准不支持的更复杂的数据库特定类型CallableStatement.getObject
方法中,我们引入了两个新的附加属性<sql-parameter-definition/>
带有 OUT 方向的元素:
-
type-name
-
return-type
这row-mapper
存储过程入站通道适配器的属性<returning-resultset/>
child 元素现在支持对RowMapper
bean 定义。
以前,它只包含一个类名(仍然受支持)。
有关详细信息,请参阅存储过程。
Web 服务出站 URI 配置
Web 服务出站网关“uri”属性现在支持<uri-variable/>
替换 Spring Web Services 支持的所有 URI 方案。
有关详细信息,请参阅出站 URI 配置。
Redis 适配器更改
Redis 入站通道适配器现在可以使用null
值serializer
属性,原始数据是消息有效负载。
Redis 出站通道适配器现在具有topic-expression
属性来确定Message
在运行时。
Redis 入站通道适配器,除了现有的topics
属性,现在具有topic-patterns
属性。
有关详细信息,请参阅 Redis 支持。
Advising Filters
以前,当<filter/>
有一个<request-handler-advice-chain/>
,则丢弃作全部在通知链的范围内执行(包括discard-channel
).
过滤器元件现在有一个名为discard-within-advice
(默认值:true
) 以允许在通知链完成后执行丢弃作。
请参阅建议过滤器。
使用注释为端点提供建议
现在可以使用注释配置请求处理程序通知链。 请参阅使用注释通知端点。
ObjectToStringTransformer 改进
此转换器现在可以正确转换byte[]
和char[]
payloads 到String
.
有关详细信息,请参阅 Transformer。
JPA 支持更改
要持久化或合并的有效负载现在可以是java.lang.Iterable
.
在这种情况下,每个对象返回的Iterable
被视为实体,并使用基础EntityManager
.
迭代器返回的 Null 值将被忽略。
JPA 适配器现在具有附加属性,可以在执行持久性作后选择性地从关联的持久性上下文中刷新和清除实体。
检索网关没有指定要检索的第一条记录的机制,这是一个常见的用例。
检索网关现在支持通过添加first-result
和first-result-expression
属性添加到网关定义中。
有关详细信息,请参阅检索出站网关。
JPA 检索网关和入站适配器现在具有一个属性,用于将结果集中的最大结果数指定为表达式。
此外,我们还引入了max-results
要替换的属性max-number-of-results
,该文件已被弃用。max-results
和max-results-expression
用于分别提供最大结果数或表达式来计算结果集中的最大结果数。
有关更多信息,请参阅 JPA 支持。
Delayer:延迟表达
以前,<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>
或任何ApplicationListener
配置为接收ImapIdleExceptionEvent
(或其超类之一)。
消息头和 TCP
TCP 连接工厂现在支持配置灵活的机制,以通过 TCP 传输选定的标头(以及有效负载)。
一个新的TcpMessageMapper
启用标头的选择,并且您需要配置适当的序列化程序或反序列化程序来写入生成的Map
到 TCP 流。
我们添加了一个MapJsonSerializer
作为通过 TCP 传输标头和有效负载的便捷机制。
有关详细信息,请参阅传输标头。
JMS 消息驱动通道适配器
以前,在配置<message-driven-channel-adapter/>
,如果您希望使用特定的TaskExecutor
,您必须声明一个容器 bean 并通过设置container
属性。
我们添加了task-executor
,让它直接设置在适配器上。
这是对已经可用的其他几个容器属性的补充。
XsltPayloadTransformer
现在,您可以通过设置transformer-factory-class
属性。
看XsltPayloadTransformer
.