11.5. 消息 Dispatcher
概述
信息分派程序 模式(如 图 11.4 “消息 Dispatcher Pattern” 所示)用于消耗来自某个频道的消息,然后将其本地分发给执行者,后者负责处理消息。在 Apache Camel 应用程序中,执行者通常由进程中的端点表示,这些端点用于将消息传送到路由的另一部分。
图 11.4. 消息 Dispatcher Pattern
您可以使用以下方法之一在 Apache Camel 中实施消息分配模式:
JMS 选择器
如果您的应用消耗来自 JMS 队列的消息,您可以使用 JMS 选择器 来实施消息分配程序模式。JMS 选择器是涉及 JMS 标头和 JMS 属性的谓词表达式。如果选择器评估为 true
,则允许 JMS 消息访问使用者;如果选择器评估为 false
,则 JMS 消息将阻止。在很多方面,JMS 选择器类似于 第 8.2 节 “消息过滤器”,但它具有在 JMS 供应商内实施过滤的额外优势。这意味着,JMS 选择器可以在将消息传送到 Apache Camel 应用程序之前阻止消息。这带来了显著的效率优势。
在 Apache Camel 中,您可以通过在 JMS 端点 URI 设置 选择器
查询选项来定义消费者端点上的 JMS 选择器。例如:
from("jms:dispatcher?selector=CountryCode='US'").to("cxf:bean:replica01"); from("jms:dispatcher?selector=CountryCode='IE'").to("cxf:bean:replica02"); from("jms:dispatcher?selector=CountryCode='DE'").to("cxf:bean:replica03");
如果谓词字符串中显示的 predicates 基于 SQL92 条件表达式语法的子集(完整详情,请参阅 JMS 规格)。选择器字符串中显示的标识符可以指代 JMS 标头或 JMS 属性。例如,在前面的路由中,发送者会设置名为 CountryCode
的 JMS 属性。
如果要向 Apache Camel 应用中的消息中添加 JMS 属性,可以通过设置邮件标题(在消息或 Out 消息上)来实现。在读取或写入 JMS 端点时,Apache Camel 会将 JMS 标头和 JMS 属性映射到其原生消息标头。
从技术上讲,选择器字符串必须按照 应用程序/x-www-form-urlencoded
MIME 格式进行编码(请参阅 HTML 规格)。在实践中,和(ampersand)字符可能会造成困难,因为它用于限制 URI 中的每个查询选项。对于可能需要嵌入 和 字符的复杂选择器字符串,您可以使用
java.net.URLEncoder
实用程序类对字符串进行编码。例如:
from("jms:dispatcher?selector=" + java.net.URLEncoder.encode("CountryCode='US'","UTF-8")). to("cxf:bean:replica01");
其中必须使用 UTF-8 编码。
ActiveMQ 中的 JMS 选择器
您还可以在 ActiveMQ 端点上定义 JMS 选择器。例如:
from("activemq:dispatcher?selector=CountryCode='US'").to("cxf:bean:replica01"); from("activemq:dispatcher?selector=CountryCode='IE'").to("cxf:bean:replica02"); from("activemq:dispatcher?selector=CountryCode='DE'").to("cxf:bean:replica03");
如需了解更多详细信息,请参阅 ActiveMQ: JMS Selectors 和 ActiveMQ Message Properties。
基于内容的路由器
基于内容的路由器模式和消息分配模式之间的重要区别在于,基于内容的路由器会将消息分配给物理独立的目的地(远程端点)和消息分配程序,在本地相同的进程空间中。在 Apache Camel 中,这两种模式之间的区别由目标端点决定。相同的路由器逻辑用于实施基于内容的路由器和消息分配程序。当目标端点远程时,路由会定义基于内容的路由器。当目标端点处于进程中时,路由会定义一个消息分配程序。
有关如何使用基于内容的路由器模式的详情和示例,请参阅 第 8.1 节 “基于内容的路由器”。