13.2. 如何指示表达式语言


先决条件

在使用特定表达式语言前,您必须确保在类路径上提供所需的 JAR 文件。如果您要使用的语言没有包括在 Apache Camel 内核中,您必须将相关的 JAR 添加到您的 classpath 中。

如果使用 Maven 构建系统,只需将相关依赖项添加到 POM 文件即可修改 build-time 类路径。例如,如果要使用 Ruby 语言,请在 POM 文件中添加以下依赖项:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-groovy</artifactId>
  <!-- Use the same version as your Camel core version -->
  <version>${camel.version}</version>
</dependency>

如果要在红帽 Fuse OSGi 容器中部署应用程序,您还需要确保安装相关的语言功能(选项以相应的 Maven 工件命名)。例如,要在 OSGi 容器中使用 Groovy 语言,您必须首先通过输入以下 OSGi 控制台命令安装 camel-groovy 功能:

karaf@root> features:install camel-groovy
注意

如果您在路由中使用表达式或 predicate,请使用 resource:classpath:pathresource:file:path 将该值指代为外部资源。例如,resource:classpath:com/foo/myscript.groovy

Camel on EAP 部署

Camel 在 EAP (Wildfly Camel)框架上支持 camel-groovy 组件,它在 Red Hat JBoss Enterprise Application Platform (JBoss EAP)容器上提供了简化的部署模型。

调用方法

表 13.1 “表达式和 predicates 语言” 所示,调用表达式语言有几个不同的语法,具体取决于它所使用的上下文。您可以调用表达式语言:

作为静态方法

大多数语言定义了一个静态方法,可在 org.apache.camel.Expression 类型或 org.apache.camel.Predicate 类型 的任何 上下文中使用。静态方法使用字符串表达式(或 predicate)作为其参数,并返回 Expression 对象(通常是 Predicate 对象)。

例如,要实施以 XML 格式处理消息的基于内容的路由器,您可以根据 /order/address/countryCode 元素的值路由消息,如下所示:

from("SourceURL")
  .choice
    .when(xpath("/order/address/countryCode = 'us'"))
      .to("file://countries/us/")
    .when(xpath("/order/address/countryCode = 'uk'"))
      .to("file://countries/uk/")
    .otherwise()
      .to("file://countries/other/")
  .to("TargetURL");

作为流畅的 DSL 方法

Java fluent DSL 支持另一种调用表达式语言的样式。您可以不提供表达式作为企业集成模式(EIP)的参数,而是提供表达式作为 DSL 命令的子目录。例如,除了调用 XPath 表达式为 filter (xpath ("Expression")),您可以调用表达式为 filter ().xpath ("Expression")

例如,前面的基于内容的路由器可以按照以下调用方式重新实施,如下所示:

from("SourceURL")
  .choice
    .when().xpath("/order/address/countryCode = 'us'")
      .to("file://countries/us/")
    .when().xpath("/order/address/countryCode = 'uk'")
      .to("file://countries/uk/")
    .otherwise()
      .to("file://countries/other/")
  .to("TargetURL");

作为 XML 元素

您还可以通过将表达式字符串放在相关 XML 元素中,在 XML 中调用表达式语言。

例如,在 XML 中调用 XPath 的 XML 元素是 xpath (属于标准 Apache Camel 命名空间)。您可以在基于 XML DSL 内容的路由器中使用 XPath 表达式,如下所示:

<from uri="file://input/orders"/>
<choice>
  <when>
    <xpath>/order/address/countryCode = 'us'</xpath>
    <to uri="file://countries/us/"/>
  </when>
  <when>
    <xpath>/order/address/countryCode = 'uk'</xpath>
    <to uri="file://countries/uk/"/>
  </when>
  <otherwise>
    <to uri="file://countries/other/"/>
  </otherwise>
</choice>

或者,您可以使用 language 元素指定语言表达式,您可以在其中在 language 属性中指定语言名称。例如,您可以使用 language 元素定义 XPath 表达式,如下所示:

<language language="xpath">/order/address/countryCode = 'us'</language>

作为注解

语言注解在 bean 集成上下文中使用。注解提供了一种便捷的方式,可以从消息或标头中提取信息,然后将提取的数据注入 bean 的方法解析器。

例如,考虑 bean myBeanProc,它被调用为 filter () EIP 的 predicate。如果 bean 的 checkCredentials 方法返回 true,则消息被允许继续;但是,如果方法返回 false,则过滤器会阻止消息。过滤器模式实现,如下所示:

// Java
MyBeanProcessor myBeanProc = new MyBeanProcessor();

from("SourceURL")
  .filter().method(myBeanProc, "checkCredentials")
  .to("TargetURL");

MyBeanProcessor 类的实现利用 @XPath 注释从底层 XML 消息中提取 用户名和密码 ,如下所示:

// Java
import org.apache.camel.language.XPath;

public class MyBeanProcessor {
    boolean void checkCredentials(
        @XPath("/credentials/username/text()") String user,
        @XPath("/credentials/password/text()") String pass
    ) {
        // Check the user/pass credentials...
        ...
    }
}

@XPath 注释仅放在注入了参数之前。注意 XPath 表达式如何 明确选择 文本节点,方法是将 /text () 附加到路径,这样可确保仅选中元素的内容,而不是分隔标签。

作为 Camel 端点 URI

使用 Camel Language 组件,您可以在端点 URI 中调用受支持的语言。有两种替代语法:

要调用存储在文件中的语言脚本(或者由 Scheme定义的其他资源类型),请使用以下 URI 语法:

language://LanguageName:resource:Scheme:Location[?Options]

其中,方案可以是 文件:classpath:http:

例如,以下路由从 classpath 执行 mysimplescript.txt

from("direct:start")
  .to("language:simple:classpath:org/apache/camel/component/language/mysimplescript.txt")
  .to("mock:result");

要调用嵌入的语言脚本,请使用以下 URI 语法:

language://LanguageName[:Script][?Options]

例如,要运行存储在 script 字符串中的简单语言 脚本

String script = URLEncoder.encode("Hello ${body}", "UTF-8");
from("direct:start")
  .to("language:simple:" + script)
  .to("mock:result");

有关语言组件的详情,请参阅 Apache Camel 组件参考指南 中的 语言

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.