5.4. 管道和过滤器


概述

图 5.4 “管道和过滤器模式” 中显示的 管道和过滤器 模式描述了通过创建过滤器链来构建路由的方法,其中一个过滤器的输出会被放入管道中下一过滤器的输入中(类似于 UNIX pipe 命令)。管道方法的优点是它允许您编写服务(某些服务可以是 Apache Camel 应用程序外部)以创建更复杂的消息处理形式。

图 5.4. 管道和过滤器模式

管道和过滤器模式

InOut Exchange pattern 的管道

通常,管道中的所有端点都有一个输入(消息)和一个输出(Out 消息),这意味着它们与 In Out 消息交换模式兼容。图 5.5 “InOut Exchanges 的管道” 中显示通过 InOut 管道的典型消息流。

图 5.5. InOut Exchanges 的管道

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 元素。 元素的前导组合与管道具有意义。请参阅 “pipeline ()和 to ()DSL 命令的比较”一节

InOnly 和 RobustInOnly 交换模式的管道

当管道中没有来自端点的 Out 消息时(因为 InOnlyRobustInOnly Exchange 模式的情况),管道无法正常连接。在这个特殊情况下,管道通过将原始 In 消息的副本传递给管道中的每个端点,如 图 5.6 “InOnly Exchanges 的管道” 所示。这种类型的管道等同于带有固定目的地的接收者列表(请参阅 第 8.3 节 “接收者列表”)。

图 5.6. InOnly Exchanges 的管道

InOnly Exchanges 的管道

此管道的路由使用与 InOut 管道(Java DSL 或 XML 中)相同的语法来定义。

pipeline ()和 to ()DSL 命令的比较

在 Java DSL 中,您可以使用以下任何一种语法定义管道路由:

  • 使用 pipeline ()processor 命令 wagon-wagon 使用管道处理器来构建管道路由,如下所示:

    from(SourceURI).pipeline(FilterA, FilterB, TargetURI);
  • 使用 to ()命令,使用 to () 命令构建管道路由,如下所示:

    from(SourceURI).to(FilterA, FilterB, TargetURI);

    另外,您可以使用等效的语法:

    from(SourceURI).to(FilterA).to(FilterB).to(TargetURI);

在使用 to () 命令语法时要谨慎,因为它 并不总是 相当于一个管道处理器。在 Java DSL 中,可通过路由中的上一命令修改 to () 的含义。例如,当 multicast () 命令在 to () 命令前,它会将列出的端点绑定到多播模式,而不是管道模式(请参阅 第 8.13 节 “多播”)。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.