12.3. Wire Tap

Wire Tap

Wire Tapパターンは 図12.1「Wire Tap パターン」 に記載されているように、元のメッセージが宛先に転送される一方で、メッセージのコピーを別の Tap の場所にルーティングできます。

図12.1 Wire Tap パターン

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 コマンドは、以下のオプションをサポートします。

名前

デフォルト値

説明

uri

 

Wire Tap メッセージの送信先のエンドポイント URI。uri または ref のいずれかを使用する必要があります。

ref

 

Wire Tap メッセージの送信先のエンドポイントを参照します。uri または ref のいずれかを使用する必要があります。

executorServiceRef

 

Wire Tap メッセージを処理する際に使用するカスタム 「スレッドモデル」 を参照します。設定されていない場合、Camel はデフォルトのスレッドプールを使用します。

processorRef

 

新しいメッセージを作成するために使用するカスタム 「プロセッサー」 を参照します (送信モードなど)。以下を参照してください。

copy

true

camel 2.3: メッセージに Wire Tap を実行する際に使用する 「エクスチェンジ」 をコピーします。

onPrepareRef

 

Camel 2.8: Wire Tap のために 「エクスチェンジ」 のコピーを用意するカスタム 「プロセッサー」 を参照します。これにより、必要に応じてメッセージのペイロードをディープクローンするなど、カスタムロジックを実行できます。