1. 概要

このチュートリアルでは、 ワイヤータップエンタープライズ統合パターン(EIP)、 システムを流れるメッセージを監視するのに役立ちます。

このパターンにより、 チャネルからメッセージを永久に消費することなくメッセージを傍受する.

2. ワイヤータップパターン

ワイヤータップは、 ポイントツーポイントチャネル 。 メッセージを受信してコピーを作成し、に送信します [宛先]をタップします。

これをよりよく理解するために、ActiveMQCamelを使用してSpring Bootアプリケーションを作成しましょう。

3. Mavenの依存関係

camel- spring -boot-dependencies を追加しましょう:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-spring-boot-dependencies</artifactId>
            <version>${camel.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

次に、 camel- spring-boot-starterを追加します。

<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
</dependency>

ルートを流れるメッセージを表示するには、ActiveMQも含める必要があります。

<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-activemq-starter</artifactId>
</dependency>

4. メッセージングエクスチェンジ

メッセージオブジェクトを作成しましょう:

public class MyPayload implements Serializable {
    private String value;
    ...
}

このメッセージdirect:source に送信して、ルートを開始します。

try (CamelContext context = new DefaultCamelContext()) {
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
    connectionFactory.setTrustAllPackages(true);
    context.addComponent("direct", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
    addRoute(context);

    try (ProducerTemplate template = context.createProducerTemplate()) {
        context.start();

        MyPayload payload = new MyPayload("One");
        template.sendBody("direct:source", payload);
        Thread.sleep(10000);
    } finally {
        context.stop();
    }
}

次に、ルートを追加して目的地をタップします。

5. Exchangeをタップする

我々は使用するだろう the 盗聴を設定する方法エンドポイントURI タップ先の キャメル応答を待ちません盗聴から InOnlyへのメッセージ交換パターン 。 ワイヤータッププロセッサは、 別のスレッド

wireTap("direct:tap").delay(1000)

CamelのWireTapノードは、取引所をタップするときに2つのフレーバーをサポートします。

5.1. 従来のワイヤータップ

従来のワイヤータップルートを追加しましょう:

RoutesBuilder traditionalWireTapRoute() {
    return new RouteBuilder() {
        public void configure() {

            from("direct:source").wireTap("direct:tap")
                .delay(1000)
                .bean(MyBean.class, "addTwo")
                .to("direct:destination");

            from("direct:tap").log("Tap Wire route: received");

            from("direct:destination").log("Output at destination: '${body}'");
        }
    };
}

ここで、ラクダは Exchangeのみをコピーする ディープクローンは実行されません 。 すべてのコピーがオブジェクトを共有できます元の交換から。

複数のメッセージを同時に処理している間、 の可能性 最終ペイロードの破損。 これを防ぐために、ペイロードをTap Destinationに渡す前に、ペイロードのディープクローンを作成できます。

5.2. 新しい交換の送信

ワイヤータップEIPは表現またプロセッサー 取引所のコピーが事前入力されています 。 アン表現メッセージ本文の設定にのみ使用できます。

The プロセッサー バリエーションは、交換の設定方法(プロパティ、ヘッダーなどの設定)を完全に制御します。

ペイロードディープクローニングを実装しましょう

public class MyPayload implements Serializable {

    private String value;
    ...
    public MyPayload deepClone() {
        MyPayload myPayload = new MyPayload(value);
        return myPayload;
   }
}

それでは、実装しましょう プロセッサー 元の交換のコピーを入力として持つクラス:

public class MyPayloadClonePrepare implements Processor {

    public void process(Exchange exchange) throws Exception {
        MyPayload myPayload = exchange.getIn().getBody(MyPayload.class);
        exchange.getIn().setBody(myPayload.deepClone());
        exchange.getIn().setHeader("date", new Date());
    }
}

を使用して呼び出します onPrepare  wireTap の直後:

RoutesBuilder newExchangeRoute() throws Exception {
    return new RouteBuilder() {
        public void configure() throws Exception {

        from("direct:source").wireTap("direct:tap")
            .onPrepare(new MyPayloadClonePrepare())
            .end()
            .delay(1000);

        from("direct:tap").bean(MyBean.class, "addThree");
        }
     };
}

6. 結論

この記事では、特定のメッセージエンドポイントを通過するメッセージを監視するためにワイヤータップパターンを実装しました。 Apache Camelを使用する 盗聴、メッセージをコピーして、既存のフローを変更せずに別のエンドポイントに送信します。

Camelは、取引所をタップする2つの方法をサポートしています。 従来のワイヤータップでは、元の交換がコピーされます。 2つ目は、新しい取引所を作成することです。 この新しい交換に、メッセージ本文の新しい値を入力できます。 表現 、またはできますヘッダーを設定し、オプションで本文を使用してプロセッサー

コードサンプルはGitHubから入手できます。