8.2. Message Filter
概述 复制链接链接已复制到粘贴板!
消息过滤器 是一个处理器,用于根据特定标准消除不需要的消息。在 Apache Camel 中,消息过滤器特征(如 图 8.2 “消息过滤器模式” )通过 filter() Java DSL 命令实现。filter() 命令使用一个控制过滤器的 predicate 参数。当 predicate 为 true 时,允许传入的信息继续,如果 predicate 为 false,则会阻断传入的信息。
图 8.2. 消息过滤器模式
Java DSL 示例 复制链接链接已复制到粘贴板!
以下示例演示了如何从端点( seda:a )创建路由到端点, seda:b,它将阻断除 foo 标头具有值、bar 的消息之外的所有消息:
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("seda:a").filter(header("foo").isEqualTo("bar")).to("seda:b");
}
};
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");
from("direct:start").
filter().xpath("/person[@name='James']").
to("mock:result");
XML 配置示例 复制链接链接已复制到粘贴板!
以下示例演示了如何使用 XML 中的 XPath predicate 配置路由(请参阅 第 II 部分 “路由表达式和指定语言”):
在关闭 </filter> 标签前,确保您将要过滤的端点(例如,< ;to uri="seda:b"/>),或者过滤器不会被应用(在 2.8+ 中,省略此操作会导致错误)。
使用 Bean 过滤 复制链接链接已复制到粘贴板!
以下是使用 bean 定义过滤器行为的示例:
使用 stop() 复制链接链接已复制到粘贴板!
可作为 Camel 2.0 提供
stop 是过滤 所有消息的 特殊过滤器。当您需要在其中一个 predicates 中停止进一步处理时,停止便可在 基于内容的路由器 中使用。
在以下示例中,我们不需要在邮件正文中传递单词的消息,以便在路由中进一步传播信息。我们防止在 when() predicate 中使用 .stop()。
了解是否过滤 Exchange 复制链接链接已复制到粘贴板!
可作为 Camel 2.5 提供。
消息过滤器 EIP 将添加 Exchange 的属性,该属性将说明(如果已过滤或未过滤)。
该属性具有关键 Exchange.FILTER_MATCHED,其字符串值为 CamelFilterMatched。其值是一个布尔值,代表 true 或 false。如果值为 true,则在 filter 块中路由 Exchange。