搜索

11.5. Message Dispatcher

download PDF

概述

图 11.4 “消息分配器模式”显示的消息分配程序 模式用于消耗频道中的消息,然后在本地分发它们以执行方,后者负责处理信息。在 Apache Camel 应用程序中,执行者通常由进程端点代表,用于将消息传送到路由的另一个部分。

图 11.4. 消息分配器模式

消息分配程序模式

您可以使用以下方法之一在 Apache Camel 中实施消息分配程序模式:

JMS 选择器

如果应用使用来自 JMS 队列的消息,您可以使用 JMS 选择器 实施消息分配程序模式。JMS 选择器是涉及 JMS 标头和 JMS 属性的 predicate 表达式。如果选择器评估为 true,则允许 JMS 消息到达消费者,如果选择器评估为 false,则 JMS 消息被阻止。在很多方面,JMS 选择器类似于 第 8.2 节 “Message Filter”,但它具有在 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 属性。

如果要将 JMS 属性添加到 Apache Camel 应用程序内的消息中,您可以通过设置消息标头( In message 或 Out 消息上)来完成此操作。在读取或写入到 JMS 端点时,Apache Camel 会将 JMS 标头和 JMS 属性映射到其原生消息标头。

从技术上讲,选择器字符串必须根据 application/x-www-form-urlencoded MIME 格式进行 URL 编码(请参阅 HTML 规格)。在实践中,& (ampersand)字符可能会导致困难,因为它用于限制 URI 中的每个查询选项。对于可能需要嵌入 & amp; 字符的更复杂的选择器字符串,您可以使用 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 SelectorsActiveMQ 消息属性

基于内容的路由器

基于内容的路由器模式和消息分配器模式之间的基本区别在于,基于内容的路由器将消息分配给物理独立的目的地(远程端点),以及消息分配程序在本地分配消息,在同一进程空间内。在 Apache Camel 中,这两种模式之间的区别由目标端点决定。相同的路由器逻辑用于实施基于内容的路由器和消息分配程序。当目标端点为远程时,路由会定义一个基于内容的路由器。当目标端点处于进程中时,路由会定义一个消息分配程序。

有关如何使用基于内容的路由器模式的详情和示例,请参考 第 8.1 节 “基于内容的路由器”

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.