8.18. Dynamic Router
Dynamic Router リンクのコピーリンクがクリップボードにコピーされました!
図8.12「Dynamic Router パターン」 に示されるように、Dynamic Router パターンを使用すると、設計時にステップの順序が認識されない一連の処理ステップを通じて、メッセージを連続してルーティングできます。メッセージが通過するエンドポイントのリストは、実行時に動的に計算されます。メッセージがエンドポイントから戻るたびに、動的ルーターはルート内の次のエンドポイントを発見するために Bean にコールバックします。
図8.12 Dynamic Router パターン
Camel 2.5では、DSL に dynamicRouter が導入されました。これは、その場で slip を評価する動的な 「Routing Slip」 のようなものです。
dynamicRouter (Bean など) に使用される式が null を返して終了を示すようにしなければなりません。そうしないと、dynamicRouter は無限ループで続行されます。
Camel 2.5 以降の Dynamic Router リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.5 以降では、「Dynamic Router」 は、slip を通過する際にエクスチェンジプロパティー Exchange.SLIP_ENDPOINT を現在のエンドポイントで更新します。これにより、エクスチェンジが slip 経由でどこまで進んでいるかを調べることができます。(これは、「Dynamic Router」 の実装が 「Routing Slip」をベースとしているため、Slip です。
Java DSL リンクのコピーリンクがクリップボードにコピーされました!
Java DSL では、以下のように dynamicRouter を使用できます。
from("direct:start")
// use a bean as the dynamic router
.dynamicRouter(bean(DynamicRouterTest.class, "slip"));
from("direct:start")
// use a bean as the dynamic router
.dynamicRouter(bean(DynamicRouterTest.class, "slip"));
Bean の統合を利用してその場で slip を計算していますが、これは以下のように実装することができます。
上記の例はスレッドセーフではありません。スレッドの安全性を確保するために、Exchange に状態を格納する必要があります。
Spring XML リンクのコピーリンクがクリップボードにコピーされました!
Spring XML での同じ例は次のとおりです。
オプション リンクのコピーリンクがクリップボードにコピーされました!
dynamicRouter DSL コマンドは以下のオプションをサポートします。
| Name (名前) | デフォルト値 | 説明 |
|
|
| パートII「ルーティング式と述語言語」 が複数のエンドポイントを返した場合に使用される区切り文字。 |
|
|
| エンドポイント URI を解決できなかった場合は、無視されます。false の場合は、Camel はエンドポイント URI が有効ではないことを示す例外をスローします。 |
@DynamicRouter アノテーション リンクのコピーリンクがクリップボードにコピーされました!
@DynamicRouter アノテーションを使用することもできます。以下に例を示します。
route メソッドは、メッセージが処理される際に繰り返し呼び出されます。次の宛先のエンドポイント URI を返すために行われます。null を返して終了を示します。「Routing Slip」 のように複数のエンドポイントを返すことができます。ここでは、各エンドポイントは区切り文字で区切られます。