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>