8.2. 消息过滤器
概述
消息过滤器 是一个处理器,它消除了基于特定条件的意外消息。在 Apache Camel 中,消息过滤器模式(如 图 8.2 “Message Filter Pattern” )由 filter ()
Java DSL 命令实施。filter ()
命令采用控制过滤器的单个 predicate 参数。当 predicate 为 true
时,允许传入的消息继续,并且当 predicate 为 false
时,传入消息会被阻断。
图 8.2. Message Filter Pattern
Java DSL 示例
以下示例演示了如何从端点( seda:a
)创建路由到端点,seda:b
会阻止除 foo
标头具有值 的消息外的所有消息,条条
:
RouteBuilder builder = new RouteBuilder() { public void configure() { from("seda:a").filter(header("foo").isEqualTo("bar")).to("seda:b"); } };
要评估更复杂的过滤器 predicates,您可以调用其中一个受支持的脚本语言,如 XPath、XQuery 或 SQL (请参阅 第 II 部分 “路由表达式和专用语言”)。以下示例定义了一条阻止除包含 name
属性等于 James
的个人元素之外的所有消息的路由:
from("direct:start"). filter().xpath("/person[@name='James']"). to("mock:result");
XML 配置示例
以下示例演示了如何使用 XML 中的 XPath predicate 配置路由(请参阅 第 II 部分 “路由表达式和专用语言”):
<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>
在关闭 </filter> 标签之前,确保将您要过滤的端点(例如,< to uri="seda:b"
/> ;
)放在结束 </filter> 标签之前,或者不会应用过滤器(在 2.8+ 中,忽略它会导致错误)。
使用 Bean 进行过滤
以下是使用 bean 定义过滤器行为的示例:
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"); } }
使用 stop ()
可作为 Camel 2.0 提供
stop 是特殊的过滤器,过滤掉 所有消息。当您需要在其中一个 predicates 中停止进一步处理时,停止在基于内容的路由器中使用它非常方便。???
在以下示例中,我们不希望在消息正文中使用词语 Bye
的消息来在路由中进一步传播任何信息。我们可防止使用 .stop ()
的 when ()
predicate 中的它。
from("direct:start")
.choice()
.when(bodyAs(String.class).contains("Hello")).to("mock:hello")
.when(bodyAs(String.class).contains("Bye")).to("mock:bye").stop()
.otherwise().to("mock:other")
.end()
.to("mock:result");
了解是否过滤了 Exchange,或没有过滤
可作为 Camel 2.5 提供
消息过滤器 EIP 将在 Exchange 上添加一个属性,该属性在经过过滤或未过滤时显示该属性。
该属性具有密钥 Exchange.FILTER_MATCHED
,它的 String 的值为 CamelFilterMatched
。其值是一个布尔值,表示为 true
或 false
。如果值为 true
,则 Exchange 在过滤器块中被路由。