5.4. 管道和过滤器
概述
管道和过滤器 模式(在 图 5.4 “管道和过滤器模式” 所示)描述了通过创建一个过滤器链来构建路由的方法,其中一个过滤器的输出被放入管道中下一个过滤器的输入中(与 UNIX 管道命令类似)。管道方法的优点是,它允许您编写服务(某些服务可以是 Apache Camel 应用程序的外部),以创建更复杂的消息处理形式。
图 5.4. 管道和过滤器模式
InOut 交换模式的管道
通常,管道中的所有端点都有一个输入(消息)和输出(明确消息),这意味着它们与 In Out 消息交换模式兼容。图 5.5 “InOut Exchanges 的管道” 中显示通过 InOut 管道的典型消息流。
图 5.5. InOut Exchanges 的管道
管道将每个端点的输出连接到下一个端点的输入。来自最终端点的 Out 消息发回到原始调用者。您可以定义此管道的路由,如下所示:
from("jms:RawOrders").pipeline("cxf:bean:decrypt", "cxf:bean:authenticate", "cxf:bean:dedup", "jms:CleanOrders");
相同的路由可以在 XML 中配置,如下所示:
<camelContext id="buildPipeline" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="jms:RawOrders"/> <to uri="cxf:bean:decrypt"/> <to uri="cxf:bean:authenticate"/> <to uri="cxf:bean:dedup"/> <to uri="jms:CleanOrders"/> </route> </camelContext>
XML 中没有专用的 pipeline 元素。前面的 from
和 与
元素的组合与管道有分离。请参阅 “pipeline ()和 to ()DSL 命令的比较”一节。
InOnly 和 RobustInOnly Exchange 模式的管道
当管道中没有来自端点的 Out 消息(如 InOnly
和 Robust InOnly Exchange
模式)时,管道无法正常连接。在这个特殊情况下,管道通过将原始 In 消息的副本传递给管道中的每个端点来构建,如 图 5.6 “InOnly Exchanges 的管道” 所示。这种类型的管道等同于带有固定目的地的接收者列表(请参阅 第 8.3 节 “接收者列表”)。
图 5.6. InOnly Exchanges 的管道
此管道的路由使用与 InOut 管道相同的语法定义(Java DSL 或 XML 中)。
pipeline ()和 to ()DSL 命令的比较
在 Java DSL 中,您可以使用以下语法之一定义管道路由:
使用 pipeline ()处理器命令 criu-wagon 使用管道处理器构建管道路由,如下所示:
from(SourceURI).pipeline(FilterA, FilterB, TargetURI);
使用 to ()命令 criu-wagonUse
to ()
命令以构造管道路由,如下所示:from(SourceURI).to(FilterA, FilterB, TargetURI);
或者,您可以使用等同的语法:
from(SourceURI).to(FilterA).to(FilterB).to(TargetURI);
使用 to ()
命令语法时要谨慎,因为它 并不 始终等同于管道处理器。在 Java DSL 中,以上命令可在路由中修改 to ()
的含义。例如,当 multicast ()
命令早于 to ()
命令时,它会将列出的端点绑定到多播模式,而不是管道模式(请参阅 第 8.13 节 “多播”)。