10.4. 声明检查 EIP
声明检查 EIP
声明检查 EIP 模式(在 图 10.4 “声明检查模式” 中显示的模式)允许您将消息内容替换为声明检查(一个唯一的键)。使用 声明检查 EIP 模式,稍后检索消息内容。您可以临时将消息内容保存在持久性存储中,如数据库或文件系统。当消息内容非常大,且昂贵的发送时,这种模式很有用,且不是所有组件都需要所有信息。
当您无法与外部方信任信息时,它也很有用。在这种情况下,使用 Claim Check 来隐藏数据的敏感部分。
EIP 模式的 Camel 实施将消息内容临时存储在内部内存存储中。
图 10.4. 声明检查模式
10.4.1. 声明检查 EIP 选项
Claim Check EIP 支持下表中列出的选项:
Name | 描述 | 默认值 | 类型 |
operation | 需要使用声明检查操作。它支持以下操作:
* get-
*
*
*
* pop- 从堆栈获取最新的声明检查(不要使用密钥)。
使用 | ClaimCheckOperation | |
key | 使用特定密钥进行声明 check-id。 | 字符串 | |
filter | 指定控制您要从声明检查存储库合并的数据的过滤器。 | 字符串 | |
strategyRef |
使用自定义 | 字符串 |
过滤选项
使用 Filter
选项定义在使用 Get
或 Pop
操作时要合并的数据。使用 AggregationStrategy
将数据合并回来。默认策略使用 filter 选项,轻松指定要合并的数据。
filter
选项采用带有以下语法的 String 值:
-
正文
:聚合消息正文 -
attachments
:聚合所有消息附加 -
标头
:聚合所有消息标头 -
header:pattern
:聚合与模式匹配的所有消息标头
模式规则支持通配符和正则表达式。
-
通配符匹配(以
*
结尾且名称以模式开头) - 正则表达式匹配
要指定多个规则,用 逗号
(、)将它们分隔。
以下是包括消息正文和以 foo 开头的所有标头的基本过滤器示例:
body, header:foo*
-
仅合并消息正文:
body
-
仅合并消息附加:
附加
-
仅合并标头:
标头
-
要合并标头名称
foo
only:header:foo
如果将过滤器规则指定为空或通配符,您可以合并所有内容。如需更多信息,请参阅 过滤要合并的数据。
当您重新合并数据时,系统会覆盖任何现有的数据。此外,它还存储现有数据。
10.4.2. 使用 Include 和 Exclude Pattern 过滤选项
以下是支持用来指定 include,exclude, 或 remove 选项的前缀的语法。
- + : 要包括(这是默认模式)
- - : 要排除(exclude 优先于 include)
- -- : 要删除(删除具有优先权)
例如:
-
要跳过消息正文并合并其他内容,use
-body
-
要跳过消息标头
foo
并合并其他内容,use--header:foo
您还可以指示系统在合并数据时删除标头。例如,要删除所有以 bar 开始的标头,use-- 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
操作。
以下示例演示了如何使用 filter
选项,其中您只想将标题作为 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>