blob: e980acf183cafc0436bddb50c0fd965f2f7be513 [file] [log] [blame]
[[Intercept-Intercept]]
Intercept
~~~~~~~~~
The intercept feature in Camel supports intercepting
link:exchange.html[Exchange]s while they are _on route_. +
We have overhauled the link:intercept.html[Intercept] in Camel 2.0 so
the following information is based on Camel 2.0.
Camel supports three kinds of interceptors:
* `intercept` that intercepts each and every processing step while
routing an link:exchange.html[Exchange] in the route.
* `interceptFrom` that intercepts incoming link:exchange.html[Exchange]
in the route.
* `interceptSendToEndpoint` that intercepts when an
link:exchange.html[Exchange] is about to be sent to the given
link:endpoint.html[Endpoint].
These interceptors supports the following features:
* link:predicate.html[Predicate] using `when` to only trigger the
interceptor in certain conditions
* `stop` forces to stop continue routing the
link:exchange.html[Exchange] and mark it as completed successful. Camel
will by default *not stop*.
* `skip` when used with `interceptSendToEndpoint` will *skip* sending
the link:exchange.html[Exchange] to the original intended endpoint.
Camel will by default *not skip*.
* `interceptFrom` and `interceptSendToEndpoint` supports endpoint URI
matching by: exact uri, wildcard, regular expression. See advanced
section.
* The intercepted endpoint uri is stored as message header
`Exchange.INTERCEPTED_ENDPOINT`.
`stop` can be used in general, it does not have to be used with an
link:intercept.html[Intercept] you can use it in regular routing as
well.
You can also instruct Camel to `stop` continue routing your message if
you set the `Exchange.ROUTE_STOP` property to `"true"` or `Boolean.TRUE`
on the link:exchange.html[Exchange]. You can for instance do this from
regular Java code in a link:pojo.html[POJO] or
link:processor.html[Processor].
[[Intercept-Intercept.1]]
Intercept
^^^^^^^^^
`Intercept` is like a regular interceptor that is applied on each
processing step the link:exchange.html[Exchange] undergo while its being
routed. You can think of it as a _AOP before_ that is applied at each
DSL keyword you have defined in your route.
The classic Hello World example would be:
[source,java]
-------------------------------------------------------------------------
intercept().to("log:hello");
from("jms:queue:order").to("bean:validateOrder").to("bean:processOrder");
-------------------------------------------------------------------------
What happens is that the link:exchange.html[Exchange] is intercepted
before each processing step, that means that it will be intercepted
before
* `.to("bean:validateOrder")`
* `.to("bean:processOrder")`
So in this sample we intercept the link:exchange.html[Exchange] twice.
The `when` predicate is also support on the `intercept` so we can attach
a link:predicate.html[Predicate] to only trigger the interception under
certain conditions. +
For instance in the sample below we only intercept if the message body
contains the string word *Hello*:
And in the route below we want to stop in certain conditions, when the
message contains the word 'Hello':
[[Intercept-UsingfromSpringDSL]]
Using from Spring DSL
+++++++++++++++++++++
The same hello world sample in Spring DSL would be:
[source,xml]
--------------------------------------
<camelContext ...>
<intercept>
<to uri="log:hello"/>
</intercept>
<route>
<from uri="jms:queue:order"/>
<to uri="bean:validateOrder"/>
<to uri="bean:handleOrder"/>
</route>
</camelContext>
--------------------------------------
And the sample for using the *when* predicate would be:
And the sample for using the *when* and *stop* would be:
[[Intercept-InterceptFrom]]
InterceptFrom
^^^^^^^^^^^^^
`InterceptFrom` is for intercepting any incoming
link:exchange.html[Exchange], in any route (it intercepts all the `from`
DSLs). This allows you to do some custom behavior for received
link:exchange.html[Exchange]s. You can provide a specific uri for a
given link:endpoint.html[Endpoint] then it only applies for that
particular route.
So lets start with the logging example. We want to log all the
*incoming* requests so we use `interceptFrom` to route to the
link:log.html[Log] component. As `proceed` is default then the
link:exchange.html[Exchange] will continue its route, and thus it will
continue to `mock:first`.
You can also attach a link:predicate.html[Predicate] to only trigger if
certain conditions is meet. For instance in the route below we intercept
when a test message is send to us, so we can do some custom processing
before we continue routing:
And if we want to filter out certain messages we can use the `stop()` to
instruct Camel to stop continue routing the
link:exchange.html[Exchange]:
And if want to only apply a specific endpoint, as the *seda:bar*
endpoint in the sample below, we can do it like this:
[[Intercept-UsingfromSpringDSL.1]]
Using from Spring DSL
+++++++++++++++++++++
Intercept is of course also available using Spring DSL as shown in the
sample below:
*Notice:* `stop` is also supported in `interceptFrom` so you can
intercept from certain endpoints and route then elsewhere and `stop` to
not continue routing in the original intended route path.
[[Intercept-InterceptSendToEndpoint]]
InterceptSendToEndpoint
^^^^^^^^^^^^^^^^^^^^^^^
*Available as of Camel 2.0*
Intercept send to endpoint is triggered when an
link:exchange.html[Exchange] is being sent to the intercepted endpoint.
This allows you to route the link:exchange.html[Exchange] to a
link:detour.html[Detour] or do some custom processing before the
link:exchange.html[Exchange] is sent to the original intended
destination. You can also skip sending to the intended destination. By
default Camel will send to the original intended destination after the
intercepted route completes. And as the regular intercept you can also
define an `when` link:predicate.html[Predicate] so we only intercept if
the link:predicate.html[Predicate] evaluates to *true*. This allows you
do do a bit of filtering, to only intercept when certain criteria is
meet.
Let start with a simple example, where we want to intercept when an
link:exchange.html[Exchange] is being sent to `mock:foo`:
And this time we add the link:predicate.html[Predicate] so its only when
the message body is `Hello World` we intercept.
And to skip sending to the `mock:foo` endpoint we use the *`skip()` DSL
in the route at the end to instruct Camel to skip sending to the
original intended endpoint.
*Conditional skipping*
The combination of `skipSendToEndpoint` with a `when` predicate behaves
differently depending on the Camel version:
* *Before Camel 2.10:* the skipping is applied unconditionally whether
the `when` predicate is matched or not, i.e. the `when` predicate only
determines whether the body of the interception will execute, but it
does not control skipping behaviour
* *As of Camel 2.10:* the skipping only occurs if the `when` predicate
is matched, leading to more natural logic altogether.
[[Intercept-UsingfromSpringDSL.2]]
Using from Spring DSL
+++++++++++++++++++++
Intercept endpoint is of course also available using Spring DSL.
We start with the first example from above in Spring DSL:
And the 2nd. Notice how we can leverage the link:simple.html[Simple]
language for the link:predicate.html[Predicate]:
And the 3rd with the `skip`, notice skip is set with the
`skipSendToOriginalEndpoint` attribute on the *interceptSendToEndpoint*
tag:
[[Intercept-AdvancedusageofIntercpt]]
Advanced usage of Intercpt
^^^^^^^^^^^^^^^^^^^^^^^^^^
The `interceptFrom` and `interceptSendToEndpoint` supports endpoint URI
matching by the following rules in the given order:
* match by exact URI name. This is the sample we have seen above.
* match by wildcard
* match by regular expression.
The real endpoint that was intercepted is stored as uri in the message
IN header with the key `Exchange.INTERCEPTED_ENDPOINT`. +
This allows you to get hold of this information, when you for instance
match by wildcard. Then you know the real endpoint that was intercepted
and can react accordingly.
[[Intercept-Matchbywildcard]]
Match by wildcard
+++++++++++++++++
Match by wildcard allows you to match a range of endpoint or all of a
given type. For instance use `uri="file:*"` will match all
link:file2.html[File] based endpoints.
[source,java]
-------------------------------------
intercept("jms:*").to("log:fromjms");
-------------------------------------
Wildcards is match that the text before the * is matched against the
given endpoint and if it also starts with the same characters its a
match. For instance you can do:
[source,java]
----------------------------------------------------------
intercept("file://order/inbox/*").to("log:newfileorders");
----------------------------------------------------------
To intercept any files received from the `order/inbox` folder.
[[Intercept-Matchbyregularexpression]]
Match by regular expression
+++++++++++++++++++++++++++
Match by regular expression is just like match by wildcard but using
regex instead. So if we want to intercept incoming messages from gold
and silver JMS queues we can do:
[source,java]
-----------------------------------------------------------
intercept("jms:queue:(gold|silver)").to("seda:handleFast");
-----------------------------------------------------------
*About dynamic and static behavior of interceptFrom and
interceptSendToEndpoint*
The `interceptSendToEndpoint` is dynamic hence it will also trigger if a
dynamic URI is constructed that Camel was not aware of at startup
time. +
The `interceptFrom` is not dynamic as it only intercepts input to
routes registered as routes in `CamelContext`. So if you dynamic
construct a `Consumer` using the Camel API and consumes an
link:endpoint.html[Endpoint] then the `interceptFrom` is not triggered.
[[Intercept-SeeAlso]]
See Also
^^^^^^^^
* link:architecture.html[Architecture]
* link:aop.html[AOP]