8.16. loop
8.16.1. loop
반복문 패턴을 사용하면 메시지를 여러 번 처리할 수 있습니다. 이는 주로 테스트에 사용됩니다.
기본적으로 루프는 루프 전체에서 동일한 교환을 사용합니다. 이전 반복의 결과는 다음에 사용됩니다( 5.4절. “파이프 및 필터”참조). Camel 2.8 의 경우 대신 복사 모드를 활성화할 수 있습니다. 자세한 내용은 options 표를 참조하십시오.
8.16.2. 속성 교환
각 루프 반복에서 두 개의 교환 속성이 설정되며 루프에 포함된 모든 프로세서에서 선택적으로 읽을 수 있습니다.
| 속성 | 설명 |
|---|---|
|
| Apache Camel 2.0: 총 루프 수 |
|
| 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 명령은 다음 옵션을 지원합니다.
| 이름 | 기본값 | 설명 |
|
|
|
Camel 2.8: 복사 모드 사용 여부입니다. |
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>