OnCompletion
Camel has this concept of a Unit of Work that encompass the Exchange. The unit of work among others supports synchronization callbacks that are invoked when the Exchange is complete. The callback API is defined in org.apache.camel.spi.Synchronization
.
Tip | ||
---|---|---|
| ||
You can get hold of the |
In Camel 2.0 we have added DSL for these callbacks using the new onCompletion DSL name.
onCompletion supports the following features:
- scope: global and/or per route (route scope override all global scope)
- multiple global scope
- triggered either always, only if completed with success, or only if failed
onWhen
predicate to only trigger in certain situations
Info | ||
---|---|---|
| ||
The onCompletion runs in a separate thread in parallel with the original route. It is therefore not intended to influence the outcome of the original route. The idea for on completion is to spin off a new thread to eg send logs to a central log database, send an email, send alterts to a monitoring system, store a copy of the result message etc. |
onCompletion with route scope
The onCompletion DSL allows you to add custom routes/processors when the original Exchange is complete. Camel spin off a copy of the Exchange and routes it in a separate thread, kinda like a Wire Tap. This allows the original thread to continue while the onCompletion route is running concurrently. We decided for this model as we did not want the onCompletion route to interfere with the original route.
Note | ||
---|---|---|
| ||
You can only have 1 onCompletion in a route. Only at context scoped level you can have multiple. And notice that when you use a route scoped onCompletion then any context scoped are disabled for that given route. |
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionTest.java} |
By default the onCompletion will be triggered when the Exchange is complete and regardless if the Exchange completed with success or with an failure (such as an Exception was thrown). You can limit the trigger to only occur onCompleteOnly
or by onFauilureOnly
as shown below:
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionOnFailureOnlyTest.java} |
You can identify if the Exchange is an onCompletion Exchange as Camel will add the property Exchange.ON_COMPLETION
with a boolean value of true
when it spin offs the onCompletion Exchange.
Using onCompletion from Spring DSL
The onCompletion is defined like this with Spring DSL:
Wiki Markup |
---|
{snippet:id=e1|lang=xml|url=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionTest.xml} |
And the onCompleteOnly
and onFailureOnly
is defined as a boolean attribute on the <onCompletion> tag so the failure example would be:
Wiki Markup |
---|
{snippet:id=e1|lang=xml|url=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionOnFailureOnlyTest.xml} |
onCompletion with global scope
This works just like the route scope except from the fact that they are defined globally. An example below:
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionGlobalTest.java} |
Using onCompletion from Spring DSL
This works just like the route scope except from the fact that they are defined globally. An example below:
Wiki Markup |
---|
{snippet:id=e1|lang=xml|url=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionGlobalTest.xml} |
Info | ||
---|---|---|
| ||
If an onCompletion is defined in a route, it overrides all global scoped and thus its only the route scoped that are used. The globally scoped ones are never used. |
Using onCompletion with onWhen predicate
As other DSL in Camel you can attach a Predicate to the onCompletion so it only triggers in certain conditions, when the predicate matches.
For example to only trigger if the message body contains the word Hello
we can do like:
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionWhenTest.java} |
See Also
- Unit of Work