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>