8.16. Loop

Loop

Loop パターンにより、メッセージを複数回処理できます。これは主にテストで使用されます。

デフォルトでは、ループ全体で同じエクスチェンジが使用されます。上記は、次の反復に使用されます (「パイプとフィルター」 を参照)。Camel 2.8 から、代わりにコピーモードを有効にすることができます。詳細は、オプションの表を参照してください。

エクスチェンジプロパティー

ループ反復ごとに 2 つのエクスチェンジプロパティーが設定され、任意でループに含まれるプロセッサーで読み込むことができます。

プロパティー説明

CamelLoopSize

Apache Camel 2.0: ループの総数

CamelLoopIndex

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 コマンドは、以下のオプションをサポートします。

名前

デフォルト値

説明

copy

false

Camel 2.8: コピーモードを使用するかどうか。false の場合は、ループ中に同じエクスチェンジが使用されます。そのため、前のイテレーションの結果は次のイテレーションでも表示されます。その代わりに、コピーモードを有効にすると、入力 「エクスチェンジ」 の新規コピーで各反復が再開されます

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>