11.6. 选择ive Consumer
概述
图 11.5 “选择ive Consumer Pattern” 中显示的选择 消费者 模式描述了向传入信息应用过滤器的使用者,以便仅处理满足特定选择条件的消息。
图 11.5. 选择ive Consumer Pattern
您可以使用以下方法之一在 Apache Camel 中实施选择消费者模式:
JMS 选择器
JMS 选择器是涉及 JMS 标头和 JMS 属性的 predicate 表达式。如果选择器评估为 true
,则允许 JMS 消息访问使用者,如果选择器评估为 false
,则 JMS 消息会被阻止。例如,若要消耗来自队列的消息、选择性
,并且仅选择那些国家代码属性等于 US
的消息,您可以使用以下 Java DSL 路由:
from("jms:selective?selector=" + java.net.URLEncoder.encode("CountryCode='US'","UTF-8")). to("cxf:bean:replica01");
如果选择器字符串 America Americacode='US'
是 URL 编码(使用 UTF-8 字符),以避免在解析查询选项时出现问题。本例假定 JMS 属性 国家代码
是由发件人设置。有关 JMS 选择器的详情,请参阅 “JMS 选择器”一节。
如果选择器应用到 JMS 队列,则不会选择的消息保留在队列中,并且有可能可供附加到同一队列的其他用户使用。
ActiveMQ 中的 JMS 选择器
您还可以在 ActiveMQ 端点上定义 JMS 选择器。例如:
from("acivemq:selective?selector=" + java.net.URLEncoder.encode("CountryCode='US'","UTF-8")). to("cxf:bean:replica01");
如需了解更多详细信息,请参阅 ActiveMQ: JMS Selector 和 ActiveMQ Message Properties。
Message filter
如果无法在消费者端点上设置选择器,您可以将过滤器处理器插入到您的路由中。例如,您可以定义一个选择使用者,它仅使用 Java DSL 处理带有美国国家代码的消息,如下所示:
from("seda:a").filter(header("CountryCode").isEqualTo("US")).process(myProcessor);
同一路由可以使用 XML 配置来定义,如下所示:
<camelContext id="buildCustomProcessorWithFilter" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="seda:a"/> <filter> <xpath>$CountryCode = 'US'</xpath> <process ref="#myProcessor"/> </filter> </route> </camelContext>
有关 Apache Camel 过滤器处理器的详情请参考 第 8.2 节 “Message Filter”。
请注意,使用消息过滤器选择来自 JMS 队列 的消息。使用过滤器处理器时,阻止的消息会被简单地丢弃。因此,如果消息来自一个队列(这允许每个消息被使用一次,则每条消息就可以被使用一次: 第 11.4 节 “竞争消费者”),则不会处理阻止的消息。这可能不是您想要的行为。