1.2. 基本 Java DSL 语法


什么是 DSL?

域特定语言(DSL)是专为特殊目的设计的小型语言。DSL 不必逻辑完成,但需要足够的表达力,以便在所选域中充分描述问题。通常,DSL 不需要 专用的解析器、解释器或编译器。DSL 可以在面向对象的现有对象的主机语言上得到缓解,提供的 DSL 构造可以完全映射到主机语言 API 中。

在假设 DSL 中请考虑以下命令序列:

command01;
command02;
command03;

您可以将这些命令映射到 Java 方法调用,如下所示:

command01().command02().command03()

您甚至可以将块映射到 Java 方法调用。例如:

command01().startBlock().command02().command03().endBlock()

DSL 语法通过主机语言 API 的数据类型隐式定义。例如,一种 Java 方法的返回类型决定了您可以在接下来进行法律调用的方法(等同于 DSL 中的下一个命令)。

路由器规则语法

Apache Camel 定义了 路由器 DSL,用于定义路由规则。您可以使用此 DSL 在 RouteBuilder.configure () 实现的正文中定义规则。图 1.1 “本地路由规则” 显示用于定义本地路由规则的基本语法概述。

图 1.1. 本地路由规则

本地路由规则

本地规则始终以 from ("EndpointURL") 方法开头,该方法指定路由规则的消息源(消费者端点)。然后,您可以在规则(如 filter ())中添加任意长的处理器链。您通常使用 to ("EndpointURL") 方法完成规则,该方法为通过规则传递的消息指定目标(制作者端点)。但是,并不总是需要以 to () 结尾规则。也可以使用其他方法在规则中指定消息目标。

注意

您还可以通过使用特殊的处理器类型(如 intercept ()exception ()errorHandler ())启动规则来定义全局路由规则。全局规则超出了本指南的范围。

消费者和制作者

本地规则始终首先使用 from ("EndpointURL") 定义消费者端点,并且通常(但不总是)通过定义制作者端点(使用 to ("EndpointURL") )结束。端点 URL EndpointURL 可以使用部署时配置的任何组件。例如,您可以使用文件端点 file:MyMessageDirectory、Apache CXF 端点、cxf:MyServiceName 或 Apache ActiveMQ 端点 activemq:queue:MyQName。有关组件类型的完整列表,请参阅 Apache Camel 组件参考

Exchanges

Exchange 对象 由消息组成,由元数据增强。交换是 Apache Camel 中的中央重要性,因为交换是通过路由规则传播消息的标准表单。交换的主要因素是,如下所示:

  • 在消息 swig-wagonis 由交换封装的当前消息。当交换通过路由进行时,可以修改此消息。因此,路由开头的 In 消息通常与路由末尾的 In 消息不同。org.apache.camel.Message 类型提供消息的通用模型,以及以下部分:

    • 正文.
    • 标头.
    • 附加功能.

    务必要意识到这是一个 通用 消息模型。Apache Camel 支持各种协议和端点类型。因此,无法 标准化消息正文或消息标头的格式。例如,JMS 消息的正文格式与 HTTP 消息正文或 Web 服务消息的正文具有完全不同的格式。因此,正文和标头声明为 对象类型。然后,正文和标头的原始内容由创建交换实例的端点(即,端点出现在 from () 命令中)。

  • out message to the a temporary holding area for a ephemeral holding area for a reply message or for a transformed message.某些处理节点(特别是 to () 命令)可以通过将 In 消息视为请求来修改当前消息,将其发送到制作者端点,然后从该端点接收回复。然后,回复消息将插入到交换中的 Out 消息插槽中。

    通常,如果当前节点设置了 Out 消息,则 Apache Camel 会按照如下方式修改交换,然后将其传递到路由中的下一个节点:将丢弃旧的 In 消息,并且 Out 消息将移到 In 消息插槽。因此,回复会成为新的当前消息。有关 Apache Camel 如何在路由中连接节点的详情,请参考 第 2.1 节 “Pipeline 处理”

    然而,有一个特殊情况处理 Out 消息不同。如果路由开头的消费者端点预期回复消息,则路由末尾的 Out 消息将被视为消费者端点的回复消息(在这种情况下,最终节点 必须创建 Out 消息,或者消费者端点挂起)。

  • 消息交换模式(MEP)是要影响路由中交换和端点之间的交互,如下所示:

    • 创建原始交换的消费者端点,使用者端点会设置 MEP 的初始值。初始值指示消费者端点是否需要收到回复(例如,InOut MEP)还是不(例如 InOnly MEP)。
    • 生产者端点 HEKETI.MEP 会影响交换在路由中遇到的制作者端点(例如,当交换通过 to () 节点时)。例如,如果当前的 MEP 是 InOnly,则 a to () 节点不会预期从端点接收回复。有时您需要更改当前的 MEP,以便自定义交换与制作者端点的交互。如需了解更多详细信息,请参阅 第 1.4 节 “Endpoints”
  • Exchange properties swig-wagona 的指定属性列表,其中包含当前消息的元数据。

消息交换模式

使用 Exchange 对象可以轻松地将消息处理常规化到不同的 消息交换模式。例如,异步协议可以定义一个 MEP,它由一个消息组成,从消费者端点流到生成者端点( InOnly MEP)。另一方面,RPC 协议可能会定义一个 MEP,它由请求消息和一个回复消息( InOut MEP)。目前,Apache Camel 支持以下 MEP:

  • InOnly
  • RobustInOnly
  • InOut
  • InOptionalOut
  • OutOnly
  • RobustOutOnly
  • OutIn
  • OutOptionalIn

其中,这些消息交换模式由枚举类型 org.apache.camel.ExchangePattern 中的常量表示。

分组的交换

有时,具有封装多个交换实例的单个交换很有用。为此,您可以使用 分组的交换。分组的交换基本上是一个交换实例,其中包含存储在 Exchange.GROUPED_EXCHANGE 交换属性中的 java.util.List Exchange 对象。有关如何使用分组的交换的示例,请参阅 第 8.5 节 “聚合器”

Processors

处理器 是路由中的节点,可以访问和修改通过路由的交换流。处理器可以取 表达式或 predicate 参数,用于修改其行为。例如,图 1.1 “本地路由规则” 中显示的规则包含一个 filter () 处理器,该处理器将 xpath () predicate 用作其参数。

表达式和 predicates

表达式(与字符串或其他数据类型相同)和 predicates (评估为 true 或 false)经常作为内置处理器类型的参数进行。例如,以下过滤器规则传播 In 信息,只有在 foo 标头等于值 bar 时:

from("seda:a").filter(header("foo").isEqualTo("bar")).to("seda:b");

其中过滤器由 predicate, header ("foo").isEqualTo ("bar") 限定。要基于消息内容构建更复杂的 predicates 和表达式,您可以使用表达式和 predicate 语言之一(请参阅 第 II 部分 “路由表达式和 predicates 语言”)。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.