ワイヤータップエンタープライズ統合パターン
1. 概要
このチュートリアルでは、 ワイヤータップエンタープライズ統合パターン(EIP)、
このパターンにより、 チャネルからメッセージを永久に消費することなくメッセージを傍受する.
2. ワイヤータップパターン
ワイヤータップは、 ポイントツーポイントチャネル
これをよりよく理解するために、ActiveMQとCamelを使用して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
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を使用する 盗聴、メッセージをコピーして、既存のフローを変更せずに別のエンドポイントに送信します。
コードサンプルはGitHubでから入手できます。