A message filter is a processor that eliminates undesired
messages based on specific criteria. In Fuse Mediation Router, the message filter pattern, shown in Figure 7.2, is implemented by the filter()
Java DSL command.
The filter()
command takes a single predicate argument, which controls the
filter. When the predicate is true
, the incoming message is allowed to proceed,
and when the predicate is false
, the incoming message is blocked.
The following example shows how to create a route from endpoint, seda:a
, to
endpoint, seda:b
, that blocks all messages except for those messages whose
foo
header have the value, bar
:
RouteBuilder builder = new RouteBuilder() { public void configure() { from("seda:a").filter(header("foo").isEqualTo("bar")).to("seda:b"); } };
To evaluate more complex filter predicates, you can invoke one of the supported
scripting languages, such as XPath, XQuery, or SQL (see ????). The
following example defines a route that blocks all messages except for those containing a
person
element whose name
attribute is equal to
James
:
from("direct:start"). filter().xpath("/person[@name='James']"). to("mock:result");
The following example shows how to configure the route with an XPath predicate in XML (see ????):
<camelContext id="simpleFilterRoute" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="seda:a"/> <filter> <xpath>$foo = 'bar'</xpath> <to uri="seda:b"/> </filter> </route> </camelContext>
![]() | Filtered endpoint required inside </filter> tag |
---|---|
Make sure you put the endpoint you want to filter (for example, |
Here is an example of using a bean to define the filter behavior:
from("direct:start") .filter().method(MyBean.class, "isGoldCustomer").to("mock:result").end() .to("mock:end"); public static class MyBean { public boolean isGoldCustomer(@Header("level") String level) { return level.equals("gold"); } }
Available as of Camel 2.0
Stop is a special type of filter that filters out all messages. Stop is convenient to use in a Content Based Router when you need to stop further processing in one of the predicates.
In the following example, we do not want messages with the word Bye
in the message body to propagate any further in the route. We prevent this in the
when()
predicate using .stop()
.
from("direct:start")
.choice()
.when(body().contains("Hello")).to("mock:hello")
.when(body().contains("Bye")).to("mock:bye").stop()
.otherwise().to("mock:other")
.end()
.to("mock:result");
Knowing if Exchange was filtered or not
Available as of Camel 2.5
The Message Filter EIP will add a property on the Exchange which states if it was filtered or not.
The property has the key Exchannge.FILTER_MATCHED
which has the
String value of CamelFilterMatched
. Its value is a boolean indicating
true
or false
. If the value is
true
then the Exchange was routed in
the filter block.