12.3. Wire Tap
Wire Tap
Wire Tapパターンは 図12.1「Wire Tap パターン」 に記載されているように、元のメッセージが宛先に転送される一方で、メッセージのコピーを別の Tap の場所にルーティングできます。
図12.1 Wire Tap パターン
ストリームメッセージボディーに WireTap を実行する場合、ストリームキャッシング を有効にして、メッセージボディーを再読み込みできるようにすることを検討してください。詳細は、Stream Caching を参照してください。
wireTap ノード
Apache Camel 2.0 では、Wire Tap を実行する wireTap
ノードが導入されました。wireTap
ノードは、交換パターンが InOnly に設定されたタップされたエクスチェンジに元のエクスチェンジをコピーします。これは、タップされたエクスチェンジを 一方向 で伝播する必要があるためです。タップされたエクスチェンジは個別のスレッドで処理されるため、メインルートと同時に実行できます。
wireTap
は、エクスチェンジのタップに関して、以下の 2 つの異なるアプローチをサポートします。
- 元のエクスチェンジのコピーをタップします
- タップされたエクスチェンジをカスタマイズできるように、新しいエクスチェンジインスタンスをタップします
Camel 2.16 以降、Wire Tap 宛先にエクスチェンジを送信するときに Wire Tap EIP がイベント通知を送信します。
Camel 2.20 の時点では、Wire Tap EIP はシャットダウン中にすべての実行中の Wire Tap エクスチェンジを終了します。
元のエクスチェンジのコピーをタップします。
Java DSL を使用
from("direct:start") .to("log:foo") .wireTap("direct:tap") .to("mock:result");
Spring XML エクステンションを使用
<route> <from uri="direct:start"/> <to uri="log:foo"/> <wireTap uri="direct:tap"/> <to uri="mock:result"/> </route>
元のエクスチェンジのコピーをタップおよび変更
Java DSL を使用すると、Apache Camel はプロセッサーまたは式を使用して元のエクスチェンジのコピーを変更することができます。プロセッサーを使用すると、プロパティーやヘッダーなどを設定することができるため、エクスチェンジの配置を完全に制御することができます。式は、In のメッセージボディーの変更にのみ使用できます。
たとえば、プロセッサー を使用して元のエクスチェンジのコピーを変更するには、以下を実行します。
from("direct:start") .wireTap("direct:foo", new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader("foo", "bar"); } }).to("mock:result"); from("direct:foo").to("mock:foo");
また、式 を使用して元のエクスチェンジのコピーを変更するには、以下を実行します。
from("direct:start") .wireTap("direct:foo", constant("Bye World")) .to("mock:result"); from("direct:foo").to("mock:foo");
Spring XML エクステンションを使用すると、プロセッサー アプローチを使用して元のエクスチェンジのコピーを変更できます。ここで、processorRef
属性は myProcessor
ID を持つ Spring Bean を参照します。
<route> <from uri="direct:start2"/> <wireTap uri="direct:foo" processorRef="myProcessor"/> <to uri="mock:result"/> </route>
また、式 を使用して元のエクスチェンジのコピーを変更するには、以下を実行します。
<route> <from uri="direct:start"/> <wireTap uri="direct:foo"> <body><constant>Bye World</constant></body> </wireTap> <to uri="mock:result"/> </route>
新しいエクスチェンジインスタンスをタップします
コピーフラグを false
(デフォルトは true
) に設定すると、新規のエクスチェンジインスタンスで Wire Tap を定義できます。この場合、Wire Tap 用に最初の空のエクスチェンジが作成されます。
たとえば、プロセッサー を使用して新しいエクスチェンジインスタンスを作成するには、以下のコマンドを実行します。
from("direct:start") .wireTap("direct:foo", false, new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setBody("Bye World"); exchange.getIn().setHeader("foo", "bar"); } }).to("mock:result"); from("direct:foo").to("mock:foo");
2 番目の wireTap
引数は、コピーフラグを false
に設定し、元のエクスチェンジがコピー されず、代わりに空のエクスチェンジが作成されることを示します。
式 を使用して新しいエクスチェンジインスタンスを作成するには、以下を実行します。
from("direct:start") .wireTap("direct:foo", false, constant("Bye World")) .to("mock:result"); from("direct:foo").to("mock:foo");
Spring XML エクステンションを使用すると、wireTap
要素の copy
属性を false
に設定することで、新しいエクスチェンジが作成されることを示すことができます。
プロセッサー アプローチを使用して、新しいエクスチェンジインスタンスを作成するには、次のように、processorRef
属性が myProcessor
ID を持つ Spring Bean を参照します。
<route> <from uri="direct:start2"/> <wireTap uri="direct:foo" processorRef="myProcessor" copy="false"/> <to uri="mock:result"/> </route>
式 を使用して新しいエクスチェンジインスタンスを作成するには、以下を実行します。
<route> <from uri="direct:start"/> <wireTap uri="direct:foo" copy="false"> <body><constant>Bye World</constant></body> </wireTap> <to uri="mock:result"/> </route>
DSL での新規エクスチェンジの送信およびヘッダーの設定
Camel 2.8 から利用可能
「Wire Tap」 を使用して新しいメッセージを送信する場合、DSL から パートII「ルーティング式と述語言語」 を使用してメッセージボディーのみを設定できます。新しいヘッダーも設定する必要がある場合には、「プロセッサー」 を使用する必要があります。Camel 2.8 以降では、DSL にもヘッダーを設定できるようになりました。
以下は、次の条件で新しいメッセージを送信する例になります。
- メッセージボディーは "Bye World"
- キー "id" のあるヘッダー (値は 123)
- キー "date" のあるヘッダー (値は現在の日付)
Java DSL
from("direct:start") // tap a new message and send it to direct:tap // the new message should be Bye World with 2 headers .wireTap("direct:tap") // create the new tap message body and headers .newExchangeBody(constant("Bye World")) .newExchangeHeader("id", constant(123)) .newExchangeHeader("date", simple("${date:now:yyyyMMdd}")) .end() // here we continue routing the original messages .to("mock:result"); // this is the tapped route from("direct:tap") .to("mock:tap");
XML DSL
XML DSL は、メッセージボディーとヘッダーの設定方法が Java DSL とは若干異なります。XML では、以下のように <body> および <setHeader> を使用します。
<route> <from uri="direct:start"/> <!-- tap a new message and send it to direct:tap --> <!-- the new message should be Bye World with 2 headers --> <wireTap uri="direct:tap"> <!-- create the new tap message body and headers --> <body><constant>Bye World</constant></body> <setHeader headerName="id"><constant>123</constant></setHeader> <setHeader headerName="date"><simple>${date:now:yyyyMMdd}</simple></setHeader> </wireTap> <!-- here we continue routing the original message --> <to uri="mock:result"/> </route>
URI の使用
Wire Tap は、静的および動的エンドポイント URI をサポートします。静的エンドポイント URI は Camel 2.20 で利用できます。
以下の例は、ヘッダー ID がキュー名の一部である JMS キューに Wire Tap を実行する方法を示しています。
from("direct:start") .wireTap("jms:queue:backup-${header.id}") .to("bean:doSomething");
動的エンドポイント URI の詳細は、「Dynamic To」 を参照してください。
メッセージの準備時にカスタムロジックを実行するための onPrepare の使用
Camel 2.8 から利用可能
詳細は、「Multicast」 を参照してください。
オプション
wireTap
DSL コマンドは、以下のオプションをサポートします。
名前 | デフォルト値 | 説明 |
|
Wire Tap メッセージの送信先のエンドポイント URI。 | |
|
Wire Tap メッセージの送信先のエンドポイントを参照します。 | |
| Wire Tap メッセージを処理する際に使用するカスタム 「スレッドモデル」 を参照します。設定されていない場合、Camel はデフォルトのスレッドプールを使用します。 | |
| 新しいメッセージを作成するために使用するカスタム 「プロセッサー」 を参照します (送信モードなど)。以下を参照してください。 | |
|
| camel 2.3: メッセージに Wire Tap を実行する際に使用する 「エクスチェンジ」 をコピーします。 |
| Camel 2.8: Wire Tap のために 「エクスチェンジ」 のコピーを用意するカスタム 「プロセッサー」 を参照します。これにより、必要に応じてメッセージのペイロードをディープクローンするなど、カスタムロジックを実行できます。 |