8.16. Loop
Loop
Loop パターンにより、メッセージを複数回処理できます。これは主にテストで使用されます。
デフォルトでは、ループ全体で同じエクスチェンジが使用されます。上記は、次の反復に使用されます (「パイプとフィルター」 を参照)。Camel 2.8 から、代わりにコピーモードを有効にすることができます。詳細は、オプションの表を参照してください。
エクスチェンジプロパティー
ループ反復ごとに 2 つのエクスチェンジプロパティーが設定され、任意でループに含まれるプロセッサーで読み込むことができます。
プロパティー | 説明 |
---|---|
| Apache Camel 2.0: ループの総数 |
| Apache Camel 2.0: 現在のイテレーションのインデックス (0 ベース) |
Java DSL の例
以下の例は、direct:x
エンドポイントからリクエストを取得して、そのメッセージを mock:result
に繰り返し送信する方法を示しています。ループの反復回数は、loop()
への引数として指定するか、実行時に式を評価することで指定します。評価する場合は、式が int
として評価される必要があります (そうでない場合は RuntimeCamelException
が出力されます)。
次の例では、ループ回数を定数として渡しています。
from("direct:a").loop(8).to("mock:result");
次の例では、ループ数を決定するために単純な式を評価しています。
from("direct:b").loop(header("loop")).to("mock:result");
次の例では、XPath 式を評価してループ数を決定します。
from("direct:c").loop().xpath("/hello/@times").to("mock:result");
XML 設定の例
Spring XML でも同じルートを設定することができます。
次の例では、ループ回数を定数として渡しています。
<route> <from uri="direct:a"/> <loop> <constant>8</constant> <to uri="mock:result"/> </loop> </route>
次の例では、ループ数を決定するために単純な式を評価しています。
<route> <from uri="direct:b"/> <loop> <header>loop</header> <to uri="mock:result"/> </loop> </route>
コピーモードの使用
ここで、direct:start
エンドポイントに A の文字を含むメッセージを送信したとします。このルートの処理の出力は、各 mock:loop
エンドポイントがメッセージとして AB を受信することになります。
from("direct:start") // instruct loop to use copy mode, which mean it will use a copy of the input exchange // for each loop iteration, instead of keep using the same exchange all over .loop(3).copy() .transform(body().append("B")) .to("mock:loop") .end() .to("mock:result");
しかし、コピーモードを有効にしないと、mock:loop
は AB、ABB、および ABBB のメッセージを受信します。
from("direct:start") // by default loop will keep using the same exchange so on the 2nd and 3rd iteration its // the same exchange that was previous used that are being looped all over .loop(3) .transform(body().append("B")) .to("mock:loop") .end() .to("mock:result");
コピーモードの XL DSL での同様な例は以下のとおり
<route> <from uri="direct:start"/> <!-- enable copy mode for loop eip --> <loop copy="true"> <constant>3</constant> <transform> <simple>${body}B</simple> </transform> <to uri="mock:loop"/> </loop> <to uri="mock:result"/> </route>
オプション
loop
DSL コマンドは、以下のオプションをサポートします。
名前 | デフォルト値 | 説明 |
|
|
Camel 2.8: コピーモードを使用するかどうか。 |
Do While ループ
do while
ループを使って、条件が満たされるまでループを実行することができます。条件は true または false のいずれかになります。
DSL の場合、コマンドは LoopDoWhile
になります。以下の例では、メッセージ本文の長さが 5 文字以下になるまでループを実行します。
from("direct:start") .loopDoWhile(simple("${body.length} <= 5")) .to("mock:loop") .transform(body().append("A")) .end() .to("mock:result");
XML の場合、コマンドは loop doWhile
になります。以下の例では、メッセージ本文の長さが 5 文字以下になるまでループを実行します。
<route> <from uri="direct:start"/> <loop doWhile="true"> <simple>${body.length} <= 5</simple> <to uri="mock:loop"/> <transform> <simple>A${body}</simple> </transform> </loop> <to uri="mock:result"/> </route>