2.14. OnCompletion
2.14.1. 개요
OnCompletion DSL 이름은 작업 단위
가 완료될 때 수행할 작업을 정의하는 데 사용됩니다. 작업 단위는
전체 교환을 포함하는 Camel 개념입니다. 34.1절. “교환”을 참조하십시오. onCompletion
명령에는 다음과 같은 기능이 있습니다.
-
OnCompletion
명령의 범위는 글로벌 또는 경로당일 수 있습니다. 경로 범위는 글로벌 범위를 덮어씁니다. -
OnCompletion
은 실패 시 성공 시 트리거되도록 구성할 수 있습니다. -
onWhen
서술자는 특정 상황에서만onCompletion
을 트리거하는 데 사용할 수 있습니다. - 기본값은 스레드 풀이 아니지만 스레드 풀을 사용할지 여부를 정의할 수 있습니다.
2.14.2. OnCompletion을 위한 경로만 범위
교환에 onCompletion
DSL이 지정되면 Camel이 새 스레드를 구동합니다. 이를 통해 onCompletion
작업의 간섭 없이 원래 스레드를 계속할 수 있습니다. 경로는 하나의 onCompletion
만 지원합니다. 다음 예에서 onCompletion
은 교환이 성공 또는 실패로 완료되었는지 여부를 트리거합니다. 기본 동작입니다.
from("direct:start") .onCompletion() // This route is invoked when the original route is complete. // This is similar to a completion callback. .to("log:sync") .to("mock:sync") // Must use end to denote the end of the onCompletion route. .end() // here the original route contiues .process(new MyProcessor()) .to("mock:result");
XML의 경우 형식은 다음과 같습니다.
<route> <from uri="direct:start"/> <!-- This onCompletion block is executed when the exchange is done being routed. --> <!-- This callback is always triggered even if the exchange fails. --> <onCompletion> <!-- This is similar to an after completion callback. --> <to uri="log:sync"/> <to uri="mock:sync"/> </onCompletion> <process ref="myProcessor"/> <to uri="mock:result"/> </route>
실패 시 onCompletion
을 트리거하려면 onFailureOnly
매개변수를 사용할 수 있습니다. 마찬가지로 성공 시 onCompletion
을 트리거하려면 onCompleteOnly
매개변수를 사용합니다.
from("direct:start") // Here onCompletion is qualified to invoke only when the exchange fails (exception or FAULT body). .onCompletion().onFailureOnly() .to("log:sync") .to("mock:sync") // Must use end to denote the end of the onCompletion route. .end() // here the original route continues .process(new MyProcessor()) .to("mock:result");
XML의 경우 onFailureOnly
및 onCompleteOnly
는 onCompletion
태그에서 부울로 표시됩니다.
<route> <from uri="direct:start"/> <!-- this onCompletion block will only be executed when the exchange is done being routed --> <!-- this callback is only triggered when the exchange failed, as we have onFailure=true --> <onCompletion onFailureOnly="true"> <to uri="log:sync"/> <to uri="mock:sync"/> </onCompletion> <process ref="myProcessor"/> <to uri="mock:result"/> </route>
2.14.3. 온Completion을 위한 글로벌 범위
두 개 이상의 경로에 대한 onCompletion
을 정의하려면 다음을 수행합니다.
// define a global on completion that is invoked when the exchange is complete onCompletion().to("log:global").to("mock:sync"); from("direct:start") .process(new MyProcessor()) .to("mock:result");
2.14.4. OnIf 사용
특정 상황에서 onCompletion
을 트리거하려면 on When
서술자를 사용합니다. 다음 예제는 메시지 본문에 Hello
:이라는 단어가 포함된 경우 onCompletion
을 트리거합니다.
/from("direct:start") .onCompletion().onWhen(body().contains("Hello")) // this route is only invoked when the original route is complete as a kind // of completion callback. And also only if the onWhen predicate is true .to("log:sync") .to("mock:sync") // must use end to denote the end of the onCompletion route .end() // here the original route contiues .to("log:original") .to("mock:result");
2.14.5. 스레드 풀과 함께 또는 없는 온Completion 사용
Camel 2.14부터는 기본적으로 스레드 풀을 사용하지 않습니다. 스레드 풀을 강제로 사용하려면
executorService
를 설정하거나 parallelProcessing
을 true로 설정합니다. 예를 들어 Java DSL에서는 다음 형식을 사용합니다.
onCompletion().parallelProcessing() .to("mock:before") .delay(1000) .setBody(simple("OnComplete:${body}"));
XML의 경우 형식은 다음과 같습니다.
<onCompletion parallelProcessing="true"> <to uri="before"/> <delay><constant>1000</constant></delay> <setBody><simple>OnComplete:${body}<simple></setBody> </onCompletion>
executorServiceRef
옵션을 사용하여 특정 스레드 풀을 참조합니다.
<onCompletion executorServiceRef="myThreadPool" <to uri="before"/> <delay><constant>1000</constant></delay> <setBody><simple>OnComplete:${body}</simple></setBody> </onCompletion>>
2.14.6. 소비자 전송 응답 전에 온Completion 실행
OnCompletion
은 다음 두 가지 모드로 실행할 수 있습니다.
- AfterConsumer - 소비자가 완료된 후 실행되는 기본 모드
-
beforeConsumer - 소비자가 호출자에게 다시 응답을 쓰기 전에 실행됩니다. 이를 통해
OnCompletion
을 통해 특수 헤더 추가와 같은 교환을 수정하거나 Exchange를 응답 로거로 기록할 수 있습니다.
예를 들어 헤더로 생성된
를 응답에 추가하려면 다음과 같이 modeBeforeConsumer()
를 사용합니다.
.onCompletion().modeBeforeConsumer() .setHeader("createdBy", constant("Someone")) .end()
XML의 경우 mode 속성을 BeforeConsumer
로 설정합니다.
<onCompletion mode="BeforeConsumer"> <setHeader headerName="createdBy"> <constant>Someone</constant> </setHeader> </onCompletion>