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>