You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 11 Next »

Intercept

The intercept feature in Camel supports intercepting Exchanges while they are on route.

Camel supports three kinds of interceptors:

  • intercept that intercepts each and every processing step while routing an Exchange in the route.
  • interceptFrom that intercepts incoming Exchange in the route.
  • interceptSendToEndpoint new in Camel 2.0 that intercepts when an Exchange is about to be sent to the given Endpoint.

TODO: Is being reworked in Camel 2.0
These interceptors supports the following features:

  • Predicate using when to only trigger the interceptor in certain conditions
  • proceed when used with interceptFrom to continue routing from the point of interception when the interceptor is finished. proceed is default and can be omitted.
  • stop when used with interceptFrom will stops routing the Exchange completely. Camel will by default not stop.
  • skip when used with interceptSendToEndpoint will skip sending the Exchange to the original intended endpoint. Camel will by default not skip.

Intercept

Intercept is like a regular interceptor that is applied each each processing step the 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:

intercept().to("log:hello");

from("jms:queue:order").to("bean:validateOrder").to("bean:processOrder");

What happens is that the 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 Exchange twice.

TODO: Add support for when predicate
TODO: Add support for stop predicate (proceed is default)

Using from Spring DSL

The same hello world sample in Spring DSL would be:

<camelContext ...>
    <intercept>
        <to uri="log:hello"/>
    </intercept>

    <route>
        <from uri="jms:queue:order"/>
        <to uri="bean:validateOrder"/>
        <to uri="bean:handleOrder"/>
    </route>
</camelContext>

InterceptFrom

InterceptFrom is for intercepting any incoming Exchange, in any route (it intercepts all the from DSLs). This allows you to do some custom behavior for received Exchanges. You can provide a specific uri for a given 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 Log component. As proceed is default then the Exchange will continue its route, and thus it will continue to mock:first.

Error formatting macro: snippet: java.lang.NullPointerException

You can also attach a 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:

Error formatting macro: snippet: java.lang.NullPointerException

And if we want to filter out certain messages we can use the stop() to instruct Camel to stop continue routing the Exchange:

Error formatting macro: snippet: java.lang.NullPointerException

And if want to only apply a specific endpoint, as the seda:bar endpoint in the sample below, we can do it like this:

Error formatting macro: snippet: java.lang.NullPointerException

Using from Spring DSL

Intercept is of course also available using Spring DSL as shown in the sample below:

Error formatting macro: snippet: java.lang.NullPointerException

InterceptSendToEndpoint

Available as of Camel 2.0

Intercept send to endpoint is triggered when an Exchange is being sent to the intercepted endpoint. This allows you to route the Exchange to a Detour or do some custom processing before the 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 Predicate so we only intercept if the 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 Exchange is being sent to mock:foo:

Error formatting macro: snippet: java.lang.NullPointerException

And this time we add the Predicate so its only when the message body is Hello World we intercept.

Error formatting macro: snippet: java.lang.NullPointerException

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.

Error formatting macro: snippet: java.lang.NullPointerException

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:

Error formatting macro: snippet: java.lang.NullPointerException

And the 2nd. Notice how we can leverage the Simple language for the Predicate:

Error formatting macro: snippet: java.lang.NullPointerException

And the 3rd with the skip, notice skip is set with the skipSendToOriginalEndpoint attribute on the interceptSendToEndpoint tag:

Error formatting macro: snippet: java.lang.NullPointerException
  • No labels