在前面的章节中,我们介绍了几个内容丰富组件,这些组件可以帮助您处理消息缺少一段数据的情况。 我们还讨论了内容筛选,它允许您从邮件中删除数据项。 但是,有时我们想暂时隐藏数据。 例如,在分布式系统中,我们可能会收到具有非常大有效载荷的消息。 某些间歇性消息处理步骤可能不需要访问此有效负载,而某些消息处理步骤可能只需要访问某些标头,因此通过每个处理步骤携带大型消息有效负载可能会导致性能下降,可能会产生安全风险,并可能使调试更加困难。
存储在库中(或声明检查)模式描述了一种机制,该机制允许您将数据存储在众所周知的位置,同时仅保留指向该数据所在位置的指针(声明检查)。 您可以将该指针作为新消息的有效负载传递,从而让消息流中的任何组件在需要时立即获取实际数据。 这种方法与挂号信流程非常相似,在挂号信流程中,您可以在邮箱中收到索赔支票,然后必须去邮局领取您的实际包裹。 这也与航班后或酒店行李领取的想法相同。
Spring Integration 提供了两种类型的声明检查转换器:
-
传入索赔检查变压器
-
传出索赔检查变压器
可以使用方便的基于命名空间的机制来配置它们。
传入索赔检查变压器
传入声明检查转换器通过将传入消息存储在由其属性标识的消息存储中来转换传入消息。
以下示例定义传入声明检查转换器:message-store
<int:claim-check-in id="checkin"
input-channel="checkinChannel"
message-store="testMessageStore"
output-channel="output"/>
在前面的配置中,在 上接收的消息将保留到使用属性标识的消息存储中,并使用生成的 ID 进行索引。
该 ID 是该邮件的声明检查。
声明检查也将成为发送到 .input-channel
message-store
output-channel
现在,假设在某个时候您确实需要访问实际消息。 您可以手动访问消息存储并获取消息的内容,也可以使用相同的方法(创建转换器),只不过现在使用传出声明检查转换器将声明检查转换为实际消息。
以下列表概述了传入声明检查转换器的所有可用参数:
<int:claim-check-in auto-startup="true" (1)
id="" (2)
input-channel="" (3)
message-store="messageStore" (4)
order="" (5)
output-channel="" (6)
send-timeout=""> (7)
<int:poller></int:poller> (8)
</int:claim-check-in>
1 | 生命周期属性指示是否应在应用程序上下文启动期间启动此组件。
它默认为 。
此属性在元素中不可用。
自选。true Chain |
2 | 标识基础 Bean 定义的 ID()。
此属性在元素中不可用。
自选。MessageTransformingHandler Chain |
3 | 此端点的接收消息通道。
此属性在元素中不可用。
自选。Chain |
4 | 参考本权利要求检查变压器要使用的。
如果未指定,则缺省引用名为 的 Bean 。
自选。MessageStore messageStore |
5 | 指定此终结点作为订阅者连接到通道时的调用顺序。
当该渠道使用调度策略时,这一点尤其重要。
当此终结点本身是具有队列的通道的轮询使用者时,它不起作用。
此属性在元素中不可用。
自选。failover Chain |
6 | 标识在此终结点处理消息后发送消息的消息通道。
此属性在元素中不可用。
自选。Chain |
7 | 指定向输出通道发送应答消息时等待的最长时间(以毫秒为单位)。
默认为秒。
此属性在元素中不可用。
自选。30 Chain |
8 | 定义轮询器。
此元素在元素中不可用。
自选。Chain |
1 | 生命周期属性指示是否应在应用程序上下文启动期间启动此组件。
它默认为 。
此属性在元素中不可用。
自选。true Chain |
2 | 标识基础 Bean 定义的 ID()。
此属性在元素中不可用。
自选。MessageTransformingHandler Chain |
3 | 此端点的接收消息通道。
此属性在元素中不可用。
自选。Chain |
4 | 参考本权利要求检查变压器要使用的。
如果未指定,则缺省引用名为 的 Bean 。
自选。MessageStore messageStore |
5 | 指定此终结点作为订阅者连接到通道时的调用顺序。
当该渠道使用调度策略时,这一点尤其重要。
当此终结点本身是具有队列的通道的轮询使用者时,它不起作用。
此属性在元素中不可用。
自选。failover Chain |
6 | 标识在此终结点处理消息后发送消息的消息通道。
此属性在元素中不可用。
自选。Chain |
7 | 指定向输出通道发送应答消息时等待的最长时间(以毫秒为单位)。
默认为秒。
此属性在元素中不可用。
自选。30 Chain |
8 | 定义轮询器。
此元素在元素中不可用。
自选。Chain |
传出索赔检查变压器
传出声明检查转换器允许您将具有声明检查有效负载的消息转换为以原始内容作为其有效负载的消息。
<int:claim-check-out id="checkout"
input-channel="checkoutChannel"
message-store="testMessageStore"
output-channel="output"/>
在前面的配置中,接收到的消息应具有声明检查作为其有效负载。
传出声明检查转换器通过在消息存储中查询由提供的声明检查标识的消息,将其转换为具有原始有效负载的消息。
然后,它将新签出的消息发送到 .input-channel
output-channel
以下列表概述了传出声明检查转换器的所有可用参数:
<int:claim-check-out auto-startup="true" (1)
id="" (2)
input-channel="" (3)
message-store="messageStore" (4)
order="" (5)
output-channel="" (6)
remove-message="false" (7)
send-timeout=""> (8)
<int:poller></int:poller> (9)
</int:claim-check-out>
1 | 生命周期属性指示是否应在应用程序上下文启动期间启动此组件。
它默认为 。
此属性在元素中不可用。
自选。true Chain |
2 | 标识基础 Bean 定义的 ID()。
此属性在元素中不可用。
自选。MessageTransformingHandler Chain |
3 | 此端点的接收消息通道。
此属性在元素中不可用。
自选。Chain |
4 | 参考本权利要求检查变压器要使用的。
如果未指定,则缺省引用名为 的 Bean 。
自选。MessageStore messageStore |
5 | 指定此终结点作为订阅者连接到通道时的调用顺序。
当该渠道使用调度策略时,这一点尤其重要。
当此终结点本身是具有队列的通道的轮询使用者时,它不起作用。
此属性在元素中不可用。
自选。failover Chain |
6 | 标识在此终结点处理消息后发送消息的消息通道。
此属性在元素中不可用。
自选。Chain |
7 | 如果设置为 ,则该消息将从 by this transformer 中删除。
当消息只能被“认领”一次时,此设置非常有用。
它默认为 。
自选。true MessageStore false |
8 | 指定向输出通道发送应答消息时等待的最长时间(以毫秒为单位)。
默认为秒。
此属性在元素中不可用。
自选。30 Chain |
9 | 定义轮询器。
此元素在元素中不可用。
自选。Chain |
1 | 生命周期属性指示是否应在应用程序上下文启动期间启动此组件。
它默认为 。
此属性在元素中不可用。
自选。true Chain |
2 | 标识基础 Bean 定义的 ID()。
此属性在元素中不可用。
自选。MessageTransformingHandler Chain |
3 | 此端点的接收消息通道。
此属性在元素中不可用。
自选。Chain |
4 | 参考本权利要求检查变压器要使用的。
如果未指定,则缺省引用名为 的 Bean 。
自选。MessageStore messageStore |
5 | 指定此终结点作为订阅者连接到通道时的调用顺序。
当该渠道使用调度策略时,这一点尤其重要。
当此终结点本身是具有队列的通道的轮询使用者时,它不起作用。
此属性在元素中不可用。
自选。failover Chain |
6 | 标识在此终结点处理消息后发送消息的消息通道。
此属性在元素中不可用。
自选。Chain |
7 | 如果设置为 ,则该消息将从 by this transformer 中删除。
当消息只能被“认领”一次时,此设置非常有用。
它默认为 。
自选。true MessageStore false |
8 | 指定向输出通道发送应答消息时等待的最长时间(以毫秒为单位)。
默认为秒。
此属性在元素中不可用。
自选。30 Chain |
9 | 定义轮询器。
此元素在元素中不可用。
自选。Chain |
一次领取
有时,特定消息只能声明一次。
打个比方,考虑处理飞机行李的过程。
您在出发时托运行李,并在抵达时领取行李。
行李一经领取,除非先重新托运,否则不能再次领取。
为了适应这种情况,我们在转换器上引入了布尔属性。
默认情况下,此属性设置为。
但是,如果设置为 ,则声明的邮件将从中删除,以便无法再次声明。remove-message
claim-check-out
false
true
MessageStore
此功能对存储空间有影响,尤其是在基于内存中的情况下,如果无法删除消息,最终可能会导致 .
因此,如果您不希望产生多个声明,我们建议您将属性的值设置为 。
以下示例演示如何使用该属性:Map
SimpleMessageStore
OutOfMemoryException
remove-message
true
remove-message
<int:claim-check-out id="checkout"
input-channel="checkoutChannel"
message-store="testMessageStore"
output-channel="output"
remove-message="true"/>
关于消息存储的一句话
尽管我们很少关心声明检查的细节(只要它们有效),但您应该知道,Spring Integration 中实际声明检查(指针)的当前实现使用 UUID 来确保唯一性。
org.springframework.integration.store.MessageStore
是用于存储和检索消息的策略接口。
Spring Integration 提供了两种方便的实现:
-
SimpleMessageStore
:基于内存中的实现(默认值,适用于测试)Map
-
JdbcMessageStore
:通过 JDBC 使用关系数据库的实现