How to add postprocess interceptor in apache camel with condition?

Viewed 252

I have 4 days experience with apache camel and hence this question.

What I would like to do is to add interceptor that would be triggered AFTER endpoint if condition met.

I am able to just add AFTER endpoint interceptor by doing this:

interceptSendToEndpoint(ENDPOINT_1)
                .skipSendToOriginalEndpoint()                
                .to(ENDPOINT_1)
                .afterUrl(AFTER_ENDPOINT_1);

I would assume that if I would like to add condition to this chain I would write this:

interceptSendToEndpoint(ENDPOINT_1)
                    .skipSendToOriginalEndpoint()
                    .choice()
                    .when(conditionIsMet).to(ENDPOINT_1).afterUrl(AFTER_ENDPOINT_1)
                    .otherwise(ENDPOINT_1);

But apache camel's API thinks different. ;) (like apple)

So the logic I am trying to achieve is: If condition met - then AFTER_ENDPOINT_1 should be executed, if condition is NOT met then AFTER_ENDPOINT_1 should NOT be executed.

Could you please assist with what should I write in this scenario? Perhaps I misuse interceptors - in this case, please direct me to the right path.

2 Answers

You were pretty close, but you can leave the choice and otherwise parts out when using intercept.

Lets say you have direct:start consumer endpoint and you want to intercept messages when body contains word hello you could simply do something like this:

interceptSendToEndpoint("direct:start")
    .skipSendToOriginalEndpoint()                
    .when(body().contains("hello"))
        .log("message was intercepted ${body}");

More information about conditional intercept can be found here and here.

After 2 days of tests I came to conclusion that the best way to do it is this:

  interceptSendToEndpoint(ENDPOINT_2)
                .when(conditionMet)
                .skipSendToOriginalEndpoint()
                .to(ENDPOINT_2)
                .afterUrl(MY_AFTER_URI);

With such route:

from(MY_ROUTE_EXMPL)
                    .log("after MY_ROUTE_EXMPL log")
                    .to(ENDPOINT_1)
                    .log("after ENDPOINT_1")
                    .to(ENDPOINT_2)
                    .log("after ENDPOINT_2")
                    .to(RETURN_STRING_ENDPOINT)
                    .log("after RETURN_STRING_ENDPOINT");

with configuration this is the output when condition MET:

2021-10-11 01:40:05.322  INFO 2059 --- [nio-8990-exec-7] route3                                   : after MY_ROUTE_EXMPL log
inside: com.camel.interceptor.bean.TestConsumer.endpoint1
2021-10-11 01:40:05.323  INFO 2059 --- [nio-8990-exec-7] route3                                   : after ENDPOINT_1
inside: com.camel.interceptor.bean.TestConsumer.endpoint2
inside: com.camel.interceptor.bean.TestConsumer.afterUri
2021-10-11 01:40:05.323  INFO 2059 --- [nio-8990-exec-7] route3                                   : after ENDPOINT_2
inside : com.camel.interceptor.bean.TestConsumer.returnString
2021-10-11 01:40:05.323  INFO 2059 --- [nio-8990-exec-7] route3                                   : after RETURN_STRING_ENDPOINT

The TO endpoints are represented as simple @Consume annotated methods of void type with only single

System.out.println("inside: com.camel.interceptor.bean.TestConsumer.{ENDPOINT_METHOD_NAME}");

call.

When condition is NOT met then output is:

2021-10-11 01:44:15.005  INFO 2059 --- [io-8990-exec-10] route3                                   : after MY_ROUTE_EXMPL log
inside: com.camel.interceptor.bean.TestConsumer.endpoint1
2021-10-11 01:44:15.005  INFO 2059 --- [io-8990-exec-10] route3                                   : after ENDPOINT_1
inside: com.camel.interceptor.bean.TestConsumer.endpoint2
2021-10-11 01:44:15.005  INFO 2059 --- [io-8990-exec-10] route3                                   : after ENDPOINT_2
inside : com.camel.interceptor.bean.TestConsumer.returnString
2021-10-11 01:44:15.005  INFO 2059 --- [io-8990-exec-10] route3                                   : after RETURN_STRING_ENDPOINT

Both output are as expected.

As stated in the question: Now when condition is MET then execution goes into ENDPOINT_2 (only once) AND AFTER_URI.

When condition is NOT MET then execution goes ONLY in ENDPOINT_2 WITHOUT hitting AFTER_URI.

Here is link to repo with examples of different aproaches of interception. Those examples are made by my colleague Tarun, I only added one more example that looks as a best option to me and the same example I present here as an answer. Thank you Tarun for your help.

Here is the link to source code with examples: https://github.com/ffatheranderson/taruns_apache_camel_examples

Related