10.4. 声明检查 EIP
声明检查 EIP
通过 声明检查 EIP 模式(在 图 10.4 “声明检查模式” 所示),您可以使用声明检查(唯一键)替换消息内容。使用 声明检查 EIP 模式,稍后检索消息内容。您可以临时存储消息内容,如数据库或文件系统。当消息内容非常大(且昂贵)且不是所有组件都需要所有信息时,这个模式很有用。
当您无法使用外部方信任信息时,它也很有用。在这种情况下,使用 Claim Check 来隐藏数据的敏感部分。
EIP 模式的 Camel 实现将消息内容临时存储在内部内存存储中。
图 10.4. 声明检查模式

10.4.1. 声明检查 EIP 选项
Claim Check EIP 支持下表中列出的选项:
| Name | 描述 | 默认值 | 类型 |
| operation | 需要使用声明检查操作。它支持以下操作:
* get -
*
* set - 使用给定键设置新的声明检查。
*
* pop - 从堆栈中获取最新的声明检查(不要使用该密钥)。
使用 | ClaimCheckOperation | |
| key | 使用特定密钥进行声明 check-id。 | 字符串 | |
| filter | 指定过滤器来控制您要从声明检查存储库中合并的数据。 | 字符串 | |
| strategyRef |
使用自定义 | 字符串 |
过滤选项
使用 Filter 选项定义在使用 Get 或 Pop 操作时要合并的数据。使用 AggregationStrategy 合并数据。默认策略使用 filter 选项轻松指定要合并的数据。
filter 选项使用 String 值,语法如下:
-
正文:聚合消息正文 -
attachments: 聚合所有消息附加 -
标头:聚合所有消息标头 -
header:pattern: 要聚合与模式匹配的所有消息标头
模式规则支持通配符和正则表达式。
-
通配符匹配(模式以
*结尾,名称以模式开头) - 正则表达式匹配
要指定多个规则,请使用 逗号 (、)分隔它们。
以下是包含消息正文和以 foo 开头的所有标头的基本过滤器示例:
body, header:foo*
-
要仅合并消息正文:
正文 -
只合并消息附加:
attachments -
只合并标头:
标头 -
要合并标头名称
fooonly:header:foo
如果将过滤器规则指定为空或通配符,您可以合并所有内容。如需更多信息,请参阅 过滤要合并的数据。
当您重新合并数据时,系统会覆盖任何现有的数据。此外,它还存储现有数据。
10.4.2. 使用 Include 和 Exclude Pattern 过滤选项
以下是支持可以用来指定 include、exclude 或 remove 选项的前缀的语法。
- + :包含(这是默认模式)
- - : to exclude (exclude 优先级高于 include)
- -- : 删除(删除具有优先权)
例如:
-
要跳过消息正文和合并其他内容,请使用
-body -
要跳过消息标头
foo和合并所有其他内容,请使用--header:foo
您还可以在合并数据时指示系统删除标头。例如,要删除以 bar 开头的所有标头,请使用- --headers:bar*。
不要同时使用 include (+)和 exclude (-) header:pattern。
10.4.3. Java 示例
以下示例显示了操作中的 Push 和 Pop 操作:
from("direct:start")
.to("mock:a")
.claimCheck(ClaimCheckOperation.Push)
.transform().constant("Bye World")
.to("mock:b")
.claimCheck(ClaimCheckOperation.Pop)
.to("mock:c");
以下是使用 Get 和 Set 操作的示例。示例使用 foo 密钥。
from("direct:start")
.to("mock:a")
.claimCheck(ClaimCheckOperation.Set, "foo")
.transform().constant("Bye World")
.to("mock:b")
.claimCheck(ClaimCheckOperation.Get, "foo")
.to("mock:c")
.transform().constant("Hi World")
.to("mock:d")
.claimCheck(ClaimCheckOperation.Get, "foo")
.to("mock:e");
您可以使用 Get 操作获取相同的数据,因为它不会删除数据。但是,如果您想要只获取一次数据,请使用 GetAndRemove 操作。
以下示例演示了如何使用过滤器选项,其中您只想将标头返回为 foo 或 bar。
from("direct:start")
.to("mock:a")
.claimCheck(ClaimCheckOperation.Push)
.transform().constant("Bye World")
.setHeader("foo", constant(456))
.removeHeader("bar")
.to("mock:b")
// only merge in the message headers foo or bar
.claimCheck(ClaimCheckOperation.Pop, null, "header:(foo|bar)")
.to("mock:c");10.4.4. XML 示例
以下示例显示了操作中的 Push 和 Pop 操作。
<route>
<from uri="direct:start"/>
<to uri="mock:a"/>
<claimCheck operation="Push"/>
<transform>
<constant>Bye World</constant>
</transform>
<to uri="mock:b"/>
<claimCheck operation="Pop"/>
<to uri="mock:c"/>
</route>
以下是使用 Get 和 Set 操作的示例。示例使用 foo 密钥。
<route>
<from uri="direct:start"/>
<to uri="mock:a"/>
<claimCheck operation="Set" key="foo"/>
<transform>
<constant>Bye World</constant>
</transform>
<to uri="mock:b"/>
<claimCheck operation="Get" key="foo"/>
<to uri="mock:c"/>
<transform>
<constant>Hi World</constant>
</transform>
<to uri="mock:d"/>
<claimCheck operation="Get" key="foo"/>
<to uri="mock:e"/>
</route>
您可以使用 Get 操作获得相同的数据,因为它不会删除数据。但是,如果要获得一次数据,您可以使用 GetAndRemove 操作。
以下示例演示了如何使用 filter 选项将标头返回为 foo 或 bar。
<route>
<from uri="direct:start"/>
<to uri="mock:a"/>
<claimCheck operation="Push"/>
<transform>
<constant>Bye World</constant>
</transform>
<setHeader headerName="foo">
<constant>456</constant>
</setHeader>
<removeHeader headerName="bar"/>
<to uri="mock:b"/>
<!-- only merge in the message headers foo or bar -->
<claimCheck operation="Pop" filter="header:(foo|bar)"/>
<to uri="mock:c"/>
</route>