5.5. メッセージルーター
概要 リンクのコピーリンクがクリップボードにコピーされました!
図5.7「Message Router パターン」 に示されている メッセージルーター は、単一のコンシューマーエンドポイントからメッセージを消費し、特定の決定基準に基づいて適切なターゲットエンドポイントにリダイレクトするフィルターのタイプです。メッセージルーターはメッセージのリダイレクトのみに関与し、メッセージの内容は変更しません。
しかし、デフォルトでは、Camel がメッセージエクスチェンジを受信者のエンドポイントにルーティングするたびに、元のエクスチェンジオブジェクトのシャローコピーを送信します。シャローコピーでは、メッセージボディー、ヘッダー、アタッチメントなどの元のエクスチェンジの要素は参照のみでコピーされます。リソースを再利用するシャローコピーを送信することで、Camel はパフォーマンスを最適化します。ただし、これらのシャローコピーはすべてリンクされるため、Camel が複数のエンドポイントにメッセージをルーティングする場合は、異なる受信者にルーティングされるコピーにカスタムロジックを適用できないことがトレードオフになります。Camel を有効にして一意なバージョンのメッセージを異なるエンドポイントにルーティングする方法は、送信メッセージへのカスタム処理の適用 を参照してください。
図5.7 Message Router パターン
メッセージルーターは choice()
プロセッサーを使用して Apache Camel に簡単に実装できます。このプロセッサーでは、when()
を使用して、代替のターゲットエンドポイントをそれぞれ選択することができます (choice プロセッサーの詳細は、「プロセッサー」 を参照してください)。
Java DSL の例 リンクのコピーリンクがクリップボードにコピーされました!
以下の Java DSL の例は、foo
ヘッダーの内容に応じて、3 つの代替の宛先 (seda:a
、seda:b
、または seda:c
) にメッセージをルーティングする方法を示しています。
from("seda:a").choice() .when(header("foo").isEqualTo("bar")).to("seda:b") .when(header("foo").isEqualTo("cheese")).to("seda:c") .otherwise().to("seda:d");
from("seda:a").choice()
.when(header("foo").isEqualTo("bar")).to("seda:b")
.when(header("foo").isEqualTo("cheese")).to("seda:c")
.otherwise().to("seda:d");
XML 設定の例 リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、XML で同じルートを設定する方法を示しています。
otherwise を使用しない choice リンクのコピーリンクがクリップボードにコピーされました!
choice()
を otherwise()
句なしで使用すると、一致しないエクスチェンジはすべてデフォルトでドロップされます。