8.16. loop

8.16.1. loop

반복문 패턴을 사용하면 메시지를 여러 번 처리할 수 있습니다. 이는 주로 테스트에 사용됩니다.

기본적으로 루프는 루프 전체에서 동일한 교환을 사용합니다. 이전 반복의 결과는 다음에 사용됩니다( 5.4절. “파이프 및 필터”참조). Camel 2.8 의 경우 대신 복사 모드를 활성화할 수 있습니다. 자세한 내용은 options 표를 참조하십시오.

8.16.2. 속성 교환

각 루프 반복에서 두 개의 교환 속성이 설정되며 루프에 포함된 모든 프로세서에서 선택적으로 읽을 수 있습니다.

속성설명

CamelLoopSize

Apache Camel 2.0: 총 루프 수

CamelLoopIndex

Apache Camel 2.0: 현재 반복(0 기반)의 인덱스

8.16.3. Java DSL 예

다음 예제에서는 direct:x 끝점에서 요청을 가져온 다음 메시지를 mock:result 로 반복적으로 전송하는 방법을 보여줍니다. 루프 반복 수는 loop() 에 대한 인수로 지정되거나 런타임에 표현식을 평가하여 지정됩니다. 여기서 표현식은 int (또는 RuntimeCamelException 이 throw됨)로 평가 되어야 합니다.

다음 예제에서는 루프 수를 상수로 전달합니다.

from("direct:a").loop(8).to("mock:result");

다음 예제에서는 간단한 표현식을 평가하여 루프 수를 결정합니다.

from("direct:b").loop(header("loop")).to("mock:result");

다음 예제에서는 Cryostat 표현식을 평가하여 루프 수를 결정합니다.

from("direct:c").loop().xpath("/hello/@times").to("mock:result");

8.16.4. 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>

8.16.5. 복사 모드 사용

이제 문자 A가 포함된 direct:start 끝점에 메시지를 보냅니다. 이 경로를 처리하는 출력은 각 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, A Cryostat, AB Cryostat 메시지를 수신합니다.

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");

복사 모드에서 XML 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>

8.16.6. 옵션

loop DSL 명령은 다음 옵션을 지원합니다.

이름

기본값

설명

복사

false

Camel 2.8: 복사 모드 사용 여부입니다. false 인 경우 루프 전체에서 동일한 교환이 사용됩니다. 따라서 이전 반복의 결과는 다음 반복에 대해 표시됩니다. 대신 복사 모드를 활성화한 다음 입력 “교환” 의 새 복사본 을 사용하여 각 반복이 다시 시작됩니다.

8.16.7. Do While Cryostat

do while 루프를 사용하여 조건이 충족될 때까지 루프를 수행할 수 있습니다. 조건은 true 또는 false입니다.

DSL에서 명령은 os DoWhile 입니다. 다음 예제에서는 메시지 본문 길이가 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>