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>