10.4. Claim Check EIP
Claim Check EIP
図10.4「Claim Check パターン」 に記載されている Claim Check EIP パターンでは 、メッセージコンテンツをクレームチェック (一意の鍵) に置き換えることができます。Claim Check EIP パターンを使用して、後でメッセージコンテンツを取得します。メッセージコンテンツは、一時的にデータベースやファイルシステムなどの永続ストアに格納できます。このパターンは、メッセージコンテンツが非常に大きく (送信するに高価)、すべてのコンポーネントにすべての情報が必要でない場合に役立ちます。
また、外部の情報で信頼できない場合にも便利です。この場合、Claim Check を使用してデータの機密部分を非表示にします。
EIP パターンの Camel 実装は、メッセージコンテンツを内部メモリーストアに一時的に格納します。
図10.4 Claim Check パターン

10.4.1. Claim Check EIP オプション
Claim Check EIP は、以下の表に記載されているオプションをサポートしています。
| 名前 | 説明 | デフォルト | 型 |
| operation | Claim Check 操作を使用する必要があります。以下の操作をサポートします。
*
*
*
*
*
| ClaimCheckOperation | |
| key | Claim Check ID に特定のキーを使用します。 | String | |
| filter | Claim Check リポジトリーからマージするデータを制御するフィルターを指定します。 | String | |
| strategyRef |
デフォルトの実装の代わりにカスタム | String |
フィルターオプション
Filter オプションを使用して、Get または Pop の操作を使用する場合にマージして戻すデータを定義します。AggregationStrategy を使用してデータをマージして戻します。デフォルトのストラテジーでは、filter オプションを使用して、マージするデータを簡単に指定します。
filter オプションは、以下の構文を持つ String 値を取ります。
-
body: メッセージボディーを集約します。 -
attachments: すべてのメッセージ添付を集約します。 -
headers: すべてのメッセージヘッダーを集約します。 -
header:pattern: パターンに一致するすべてのメッセージヘッダーを集約します。
パターンルールはワイルドカードおよび正規表現をサポートします。
-
ワイルドカードの一致 (パターンが
*で終わり、名前がパターンで始まります) - 正規表現の一致
複数のルールを指定するには、commas (,) で区切ります。
以下は、メッセージボディーおよび foo で始まるすべてのヘッダーを含む基本的なフィルターの例です。
body, header:foo*
-
メッセージのボディーのみをマージする場合:
body -
メッセージの添付のみをマージする場合:
attachments -
ヘッダーのみをマージする場合:
headers -
ヘッダー名
fooのみをマージする場合:header:foo
フィルタールールを空またはワイルドカードとして指定すると、すべてをマージできます。詳細は、Filter what data to merge back を参照してください。
データをマージすると、システムは既存のデータを上書きします。また、既存のデータを格納します。
10.4.2. Include および Exclude パターンを使用したフィルターオプション
以下は、オプションを包含、除外、または削除オプションを指定するために使用できる接頭辞をサポートする構文です。
- + : 包含します (デフォルトのモード)。
- -: 除外します (除外は包含よりも優先されます)
- -- : 削除します (削除が優先されます)
以下に例を示します。
-
メッセージのボディーをスキップしてその他をすべてマージするには、
-bodyを使用します。 -
メッセージヘッダー
fooを省略してその他をすべてマージするには、-header:fooを使用します。
また、データをマージする際にヘッダーを削除するようにシステムに指示することもできます。たとえば、bar で始まるすべてのヘッダーを削除するには、--headers:bar* を使用します。
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 操作を使用して同じデータを 2 度取得できます。ただし、データを 1 度だけ取得する場合は、GetAndRemove 操作を使用します。
以下の例は、foo または bar としてヘッダーのみを取得する場合に filter オプションを使用する方法を示しています。
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 操作を使用して同じデータを 2 度取得できます。ただし、データを 1 度だけ取得する場合は、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>