5.4. pipes 和 Filters
概述
pipes 和过滤器 模式在 图 5.4 “pipes 和 Filters Pattern” 中显示的是,它通过创建过滤器链来构造路由的方法,其中单个过滤器的输出将反馈到管道中下一个过滤器的输入(与 UNIX pipe
命令相同)。管道方法的优点在于,它可让您编写服务(某些服务可能是 Apache Camel 应用程序外部)以创建更加复杂的消息处理。
图 5.4. pipes 和 Filters Pattern
![pipes 和过滤器特征](https://access.redhat.com/webassets/avalon/d/Red_Hat_Fuse-7.11-Apache_Camel_Development_Guide-zh-CN/images/e29eae04f7f66ceab684a05c212323d9/pipes_and_filters.gif)
InOut Exchange 模式的管道
通常,管道中的所有端点都有一个输入(在消息中)和一个输出(输出),这意味着它们与 In Out 消息交换模式兼容。图 5.5 “InOut Exchanges 的管道” 中显示了通过 InOut 管道的典型消息流。
图 5.5. InOut Exchanges 的管道
![InOut 交换的管道](https://access.redhat.com/webassets/avalon/d/Red_Hat_Fuse-7.11-Apache_Camel_Development_Guide-zh-CN/images/70a79cb4db59e9756254d22bd9e8ffff/messaging_systems_01.gif)
管道将每个端点的输出连接到下一端点的输入。来自最终端点的 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()和 to()DSL 命令的比较”一节。
InOnly 和 RobustInOnly Exchange 模式的管道
如果没有来自管道中端点的 Out 消息(如 InOnly 和 Robust
交换模式的情况),则管道不能以正常方式连接。在这种特殊情况下,管道通过将原始 In 消息的副本传递给管道中的每个端点,如 图 5.6 “InOnly Exchanges 的管道” 所示。这个管道类型等同于带有固定目的地的接收者列表(请参阅 第 8.3 节 “接收者列表”)。
InOnly
图 5.6. InOnly Exchanges 的管道
![用于 InOnly 交换的管道](https://access.redhat.com/webassets/avalon/d/Red_Hat_Fuse-7.11-Apache_Camel_Development_Guide-zh-CN/images/141b66898734eb696f74fcc6cee5526a/messaging_systems_02.gif)
此管道的路由使用与 InOut 管道(Java DSL 或 XML)相同的语法来定义。
pipeline()和 to()DSL 命令的比较
在 Java DSL 中,您可以使用以下语法之一定义管道路由:
使用 pipeline()处理器命令 the the pipeline processor 使用管道处理器构建管道路由,如下所示:
from(SourceURI).pipeline(FilterA, FilterB, TargetURI);
使用 to()命令 abrt- theUse the
to()
命令构建管道路由,如下所示:from(SourceURI).to(FilterA, FilterB, TargetURI);
另外,您可以使用等同的语法:
from(SourceURI).to(FilterA).to(FilterB).to(TargetURI);
在使用 to()
命令语法时要谨慎,因为它 并不总是 等同于管道处理器。在 Java DSL 中,可以通过以上命令在路由中修改 to()
的含义。例如,当 multicast()
命令前面是 to()
命令,它会将列出的端点绑定到多播模式,而不是管道模式(请参阅 第 8.13 节 “多播”)。