1.2. 基本 Java DSL 语法


什么是 DSL?

域特定语言(DSL)是设计用于特殊用途的小型语言。DSL 不必以逻辑方式完成,但需要足够的能力来描述在所选域中充分描述问题。通常,DSL 不需要 专用的解析程序、解释器或编译器。DSL 可在现有面向对象的主机语言的顶部 piggyback,提供的 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. 本地路由规则

本地路由规则

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

注意

您还可以使用特殊处理器类型(如拦截器()、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 中至关重要,因为交换是通过路由规则传播消息的标准表单。交换的主要拥塞如下:

  • 在消息 您的应用程序器中,由交换封装的当前消息。随着交换通过路由进行,可以修改此消息。因此,在路由开始时的 In 消息通常与路由末尾的 In 消息 不同org.apache.camel.Message 类型提供了消息的通用模型,包括以下部分:

    • 正文.
    • 标头.
    • 附件.

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

  • out message chronyc-ocpis 是用于回复消息的临时区域,或者用于转换的消息。某些处理节点(特别是 to () 命令)可以通过将 In 消息视为请求来修改当前的消息,将其发送到制作者端点,然后从该端点接收回复。然后,将回复消息插入到交换中的 Out message 插槽中。

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

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

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

    • 消费者端点 TOKEN-将消费者端点创建原始交换,设置 MEP 的初始值。初始值指示使用者端点是否需要接收回复(例如,InOut MEP)还是非(例如,InOnly MEP)。
    • 制作者端点 有助于 MEP 影响交换与路由相关的制作者端点(例如,当交换通过了 to () 节点时)。例如,如果当前 MEP 为 InOnly,则 to () 节点不会预期从端点接收回复。有时您需要更改当前 MEP,以自定义与制作者端点的交换交互。如需了解更多详细信息,请参阅 第 1.4 节 “Endpoints”
  • 交换属性的 propertiesLogForwarder-cmpia 列表,包含当前消息的元数据。

消息交换模式

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

  • InOnly
  • RobustInOnly
  • InOut
  • In optionalOut
  • OutOnly
  • RobustOutOnly
  • OutIn
  • OutOptionalIn

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

分组的交换

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

处理器

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

表达式和 predicates

表达式(评估字符串或其他数据类型)和 predicates (评估为 true 或 false)通常作为内置处理器类型的参数发生。例如,以下过滤器规则传播 In 消息,只有 foo 标头等于 value bar

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

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.