Steve Huston
Steve Huston

Reputation: 1610

Trying to stop Camel exchange processing based on filter

My question is very similar to this one but the solution there does not work for me here - I am trying to use the filter EIP to discard selected exchanges. My routes look like (edited down for clarity):

from("{{fromSource}}")
 .convertBodyTo(RequestInterface.class)
 .enrich(INVOKE_BACKEND_URI, combiner)
 .to("{{toDestination}}");

from(INVOKE_BACKEND_URI)
 .to(backendUri)
 .filter().method(DiscardResponse.class).log(LoggingLevel.INFO, "Discarding undesired response").stop().end()
 .convertBodyTo(BodyInterface.class);

When the filter does NOT select the message, all is well - the log() is not displayed and the message goes to the convertBodyTo() and then back to the main route.

However, when the filter DOES select the message, the log() text is displayed but the exchange still continues on to the convertBodyTo() where it throws an exception because it's a message that shouldn't be there. The stop() appears to either not be executed or has no affect.

Can anyone suggest a solution to this?

Upvotes: 2

Views: 3146

Answers (2)

Souciance Eqdam Rashti
Souciance Eqdam Rashti

Reputation: 3191

I guess one way could be:

from(INVOKE_BACKEND_URI)
 .to(backendUri)
 .filter().method(DiscardResponse.class).log(LoggingLevel.INFO, "Discarding undesired response")
.choice()
  .when(simple("${property.Exchange.FILTER_MATCHED}=true")
   .stop()
.end()
 .convertBodyTo(BodyInterface.class);

Take a look at the bottom of the doc here: http://camel.apache.org/message-filter.html

Upvotes: 0

Erik Karlstrand
Erik Karlstrand

Reputation: 1537

It is possible from within a Processor to do this in order to stop the exchange:

exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);

Since I'm not used to writing my routes using Java DSL I don't know if that option is available directly on the exchange within the route, but it probably is.

Upvotes: 1

Related Questions