5.5. 消息路由器
概述 复制链接链接已复制到粘贴板!
消息路由器 (如 图 5.7 “消息路由器模式” 所示)是一个过滤器,它消耗来自单个消费者端点的信息,并根据特定决策条件将它们重定向到适当的目标端点。消息路由器仅关注重定向消息;它不会修改消息内容。
但是,默认情况下,当 Camel 将消息交换路由到接收方端点时,它发送是原始交换对象的粗略副本。在粗略复制中,原始交换的元素(如消息正文、标头和附加)仅通过参考来复制。通过发送可重复利用资源的粗略副本,Camel 优化性能。但是,由于这些 shouldow 副本都是链接,因此当 Camel 将消息路由到多个端点时,代价是丢失了将自定义逻辑应用到路由到不同接收方的能力。有关如何启用 Camel 将消息的唯一版本路由到不同的端点的详情,请参考 "将自定义处理应用到传出消息"。
图 5.7. 消息路由器模式
可以使用 choice ()
处理器在 Apache Camel 中轻松实施消息路由器,其中每个替代目标端点都可以使用 when ()
子模块(有关选择处理器的详情,请参阅 第 1.5 节 “处理器”)。
Java DSL 示例 复制链接链接已复制到粘贴板!
以下 Java DSL 示例演示了如何根据 foo
标头的内容将消息路由到三个替代目的地( seda:a
、seda:b
或 seda:c
):
from("seda:a").choice() .when(header("foo").isEqualTo("bar")).to("seda:b") .when(header("foo").isEqualTo("cheese")).to("seda:c") .otherwise().to("seda:d");
from("seda:a").choice()
.when(header("foo").isEqualTo("bar")).to("seda:b")
.when(header("foo").isEqualTo("cheese")).to("seda:c")
.otherwise().to("seda:d");
XML 配置示例 复制链接链接已复制到粘贴板!
以下示例演示了如何在 XML 中配置相同的路由:
没有其他选择 复制链接链接已复制到粘贴板!
如果您使用没有 otherwise ()
子句的 choice ()
,则默认丢弃任何不匹配的交换。