10.4. 声明检查 EIP


声明检查 EIP

声明检查 EIP 模式(在 图 10.4 “声明检查模式” 中显示的模式)允许您将消息内容替换为声明检查(一个唯一的键)。使用 声明检查 EIP 模式,稍后检索消息内容。您可以临时将消息内容保存在持久性存储中,如数据库或文件系统。当消息内容非常大,且昂贵的发送时,这种模式很有用,且不是所有组件都需要所有信息。

当您无法与外部方信任信息时,它也很有用。在这种情况下,使用 Claim Check 来隐藏数据的敏感部分。

EIP 模式的 Camel 实施将消息内容临时存储在内部内存存储中。

图 10.4. 声明检查模式

存储库

10.4.1. 声明检查 EIP 选项

Claim Check EIP 支持下表中列出的选项:

Name

描述

默认值

类型

operation

需要使用声明检查操作。它支持以下操作:

* get- Get s (不会删除)给定密钥的声明检查。

* GetAndRemove - Gets 并删除给定密钥的声明检查。

* set - 使用给定键设置一个新的声明检查。如果密钥已存在,它将被覆盖。

* push - 设置堆栈上的一个新的声明检查(不要使用密钥)。

* pop- 从堆栈获取最新的声明检查(不要使用密钥)。

使用 GetGetAndRemoveSet 操作时,您必须指定一个密钥。然后,这些操作将使用 密钥存储和检索数据。使用这些操作在不同的密钥中存储多个数据。但是,推送和 弹出 操作不使用密钥,而是将数据存储在堆栈结构中。

 

ClaimCheckOperation

key

使用特定密钥进行声明 check-id。

 

字符串

filter

指定控制您要从声明检查存储库合并的数据的过滤器。

 

字符串

strategyRef

使用自定义 AggregationStrategy 而不是默认的实现。您不能同时使用自定义聚合策略并同时配置数据。

 

字符串

过滤选项

使用 Filter 选项定义在使用 GetPop 操作时要合并的数据。使用 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 示例

以下示例显示了操作中的 PushPop 操作:

from("direct:start")
    .to("mock:a")
    .claimCheck(ClaimCheckOperation.Push)
    .transform().constant("Bye World")
    .to("mock:b")
    .claimCheck(ClaimCheckOperation.Pop)
    .to("mock:c");

以下是使用 GetSet 操作的示例。这个示例使用 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 选项,其中您只想将标题作为 foobar

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 示例

以下示例显示了操作中的 PushPop 操作。

<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>

以下是使用 GetSet 操作的示例。这个示例使用 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 选项将标头返回为 foobar

<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>
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.