1.4. Endpoints

概述

Apache Camel 端点是路由中消息的源和接收器。端点是一个非常一般的构建块:它必须满足的唯一要求是它充当消息来源(制作端点)或作为消息(消费者端点)的接收器(消费者端点)。因此,Apache Camel 中支持各种不同的端点类型,范围从协议支持端点(如 HTTP)到简单的计时器端点,如 Quartz,以固定间隔生成 dummy 消息。Apache Camel 的主要优势之一是,相对容易地添加实施新端点类型的自定义组件。

端点 URI

端点通过 端点 URI 标识,其通用表单如下:

scheme:contextPath[?queryOptions]

URI 方案 标识了协议,如 httpcontextPath 提供由协议解释的 URI 详情。另外,大多数方案都允许您定义查询选项,而 queryOptions 则采用以下格式指定:

?option01=value01&option02=value02&...

例如,以下 HTTP URI 可以用来连接到 Google 搜索引擎页面:

http://www.google.com

以下文件 URI 可用于读取在 C:\temp\src\data 目录下出现的所有文件:

file://C:/temp/src/data

不是每个 方案 都代表了一个协议。有时候,方案 只需提供对有用的实用程序(如计时器)的访问。例如,以下计时器端点 URI 每秒生成交换一次(=1000 毫秒)。您可以使用它来调度路由中的活动。

timer://tickTock?period=1000

使用长 Endpoint URI

有时,端点 URI 可能会因为提供的所有配置信息而变得非常长。在 JBoss Fuse 6.2 中,您可以采用两种方法使您使用冗长的 URI 更易于管理。

配置端点 9 月

您可以单独配置端点,从路由中使用简写 ID 引用端点。

<camelContext ...>

  <endpoint id="foo" uri="ftp://foo@myserver">
    <property name="password" value="secret"/>
    <property name="recursive" value="true"/>
    <property name="ftpClient.dataTimeout" value="30000"/>
    <property name="ftpClient.serverLanguageCode" value="fr"/>
  </endpoint>

  <route>
    <from uri="ref:foo"/>
    ...
  </route>
</camelContext>

您还可以在 URI 中配置一些选项,然后使用 property 属性指定附加选项(或覆盖 URI 中的选项)。

<endpoint id="foo" uri="ftp://foo@myserver?recursive=true">
  <property name="password" value="secret"/>
  <property name="ftpClient.dataTimeout" value="30000"/>
  <property name="ftpClient.serverLanguageCode" value="fr"/>
</endpoint>
跨新行的分割端点配置

您可以使用新行分割 URI 属性。

<route>
  <from uri="ftp://foo@myserver?password=secret&amp;
           recursive=true&amp;ftpClient.dataTimeout=30000&amp;
           ftpClientConfig.serverLanguageCode=fr"/>
  <to uri="bean:doSomething"/>
</route>
注意

您可以在每行中指定一个或多个选项,每个选项由 & 分隔。

在 URI 中指定时间段

许多 Apache Camel 组件都有选项,其值是时间段(例如,指定超时值等)。默认情况下,此类时间周期选项通常指定为纯数字,被解释为毫秒的时间段。但是,Apache Camel 还支持更易读的语法,它可让您用小时、分钟和秒来表达周期。正式,人类可读的时间段是一个符合以下语法的字符串:

[NHour(h|hour)][NMin(m|minute)][NSec(s|second)]

在方括号 [] 中,每个术语都是可选的,并且符号 (A|B) 表示 AB 是 alternatives。

例如,您可以使用 45 分钟的时间配置计时器 端点,如下所示:

from("timer:foo?period=45m")
  .to("log:foo");

您还可以使用小时、分钟和第二个单元的任意组合,如下所示:

from("timer:foo?period=1h15m")
  .to("log:foo");
from("timer:bar?period=2h30s")
  .to("log:bar");
from("timer:bar?period=3h45m58s")
  .to("log:bar");

在 URI 选项中指定原始值

默认情况下,您在 URI 中指定的选项值会自动进行 URI 编码。在某些情况下这是不需要的行为。例如,当设置 password 选项时,最好在 没有 URI 编码的情况下 传输原始字符字符串。

通过利用语法指定选项值,可以切换 URI 编码,即 RAW(RawValue)。例如,

from("SourceURI")
 .to("ftp:joe@myftpserver.com?password=RAW(se+re?t&23)&binary=true")

在本例中,密码值作为字面值传输,即 se+re?t&23

不区分大小写的 enum 选项

某些端点 URI 选项映射到 Java enum constants。例如,Log 组件的 level 选项可以采用 enumINFOWARNERROR 等等。这个类型转换不区分大小写,因此可以使用以下任意一种选项来设置日志制作者端点的日志记录级别:

<to uri="log:foo?level=info"/>
<to uri="log:foo?level=INfo"/>
<to uri="log:foo?level=InFo"/>

指定 URI 资源

从 Camel 2.17,基于资源组件(如 XSLT)可以使用 ref: 作为前缀从 Registry 加载资源文件。

例如,如果myvelocityscriptbeanmysimplescriptbean 是 registry 中的两个 Bean 的 ID,您可以按照如下所示使用这些 Bean 的内容:

Velocity endpoint:
------------------
from("velocity:ref:myvelocityscriptbean").<rest_of_route>.

Language endpoint (for invoking a scripting language):
-----------------------------------------------------
from("direct:start")
  .to("language:simple:ref:mysimplescriptbean")
 Where Camel implicitly converts the bean to a String.

Apache Camel 组件

每个 URI 方案 都映射到 Apache Camel 组件,其中 Apache Camel 组件基本上是一个端点工厂。换句话说,若要使用特定类型的端点,您必须在运行时容器中部署对应的 Apache Camel 组件。例如,若要使用 JMS 端点,您要在容器中部署 JMS 组件。

Apache Camel 提供了大量不同的组件,可让您将应用程序与各种传输协议和第三方产品集成。例如,一些常用的组件有: File、JMS、CXF(Web 服务)、HTTP、Jetty、Direct 和 Mock。有关支持组件的完整列表,请参阅 Apache Camel 组件文档

大多数 Apache Camel 组件都单独打包成 Camel 内核。如果您使用 Maven 构建应用程序,只需在相关组件构件上添加依赖项即可向应用程序中添加组件(及其第三方依赖项)。例如,要包含 HTTP 组件,您要将以下 Maven 依赖项添加到项目 POM 文件中:

<!-- Maven POM File -->
  <properties>
    <camel-version>{camelFullVersion}</camel-version>
    ...
  </properties>

  <dependencies>
    ...
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-http</artifactId>
      <version>${camel-version}</version>
    </dependency>
    ...
  </dependencies>

以下组件内置到 Camel 内核(在 camel 内核 工件中),因此始终可用:

  • bean
  • 浏览
  • dataset
  • direct
  • File
  • Log
  • 模拟
  • Properties
  • Ref
  • SEDA
  • timer
  • VM

消费者端点

消费者端点 是在路由 开始时 出现的端点(即,在 from() DSL 命令中)。换句话说,使用者端点负责在路由中发起处理:它创建一个新的交换实例(通常基于它收到或获取的一些消息),并提供线程来处理路由的其余部分中的交换。

例如,以下 JMS 使用者端点会拉取出 支付 队列的消息,并在路由中处理它们:

from("jms:queue:payments")
  .process(SomeProcessor)
  .to("TargetURI");

或者,在 Spring XML 中:

<camelContext id="CamelContextID"
              xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="jms:queue:payments"/>
    <process ref="someProcessorId"/>
    <to uri="TargetURI"/>
  </route>
</camelContext>

一些组件 只是消费者 ,它们只能被用来定义消费者端点。例如,Panartz 组件专门用于定义消费者端点。以下 Quartz 端点每秒钟生成一个事件(1000 毫秒):

from("quartz://secondTimer?trigger.repeatInterval=1000")
  .process(SomeProcessor)
  .to("TargetURI");

如果您愿意,可以使用 fromF() Java DSL 命令,将端点 URI 指定为格式的字符串。例如,要将用户名和密码替换为 FTP 端点的 URI,您可以使用 Java 编写路由,如下所示:

fromF("ftp:%s@fusesource.com?password=%s", username, password)
  .process(SomeProcessor)
  .to("TargetURI");

其中,第一个位置的 %s 替换为用户名字符串的值,第二次出现 %s 替换为密码 字符串。这个字符串格式化机制由 String.format() 实施,它类似于 C printf() 函数提供的格式。详情请查看 java.util.Formatter

producer 端点

制作者端点 是在 中间 或路由 末尾 出现的端点(例如,在 to() DSL 命令中)。换句话说,制作者端点接收现有的交换对象,并将交换内容发送到指定的端点。

例如,以下 JMS producer 端点将当前交换的内容推送到指定的 JMS 队列:

from("SourceURI")
  .process(SomeProcessor)
  .to("jms:queue:orderForms");

也可以在 Spring XML 中:

<camelContext id="CamelContextID" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="SourceURI"/>
    <process ref="someProcessorId"/>
    <to uri="jms:queue:orderForms"/>
  </route>
</camelContext>

某些组件 只是制作者 ,只能用来定义制作者端点。例如,HTTP 端点专门用于定义制作者端点。

from("SourceURI")
  .process(SomeProcessor)
  .to("http://www.google.com/search?hl=en&q=camel+router");

如果您愿意,可以使用 toF() Java DSL 命令,将端点 URI 指定为格式的字符串。例如,要将自定义 Google 查询替换为 HTTP URI,您可以使用 Java 编写路由,如下所示:

from("SourceURI")
  .process(SomeProcessor)
  .toF("http://www.google.com/search?hl=en&q=%s", myGoogleQuery);

如果出现 %s 被您的自定义查询字符串 myGoogleQuery 来替换。详情请查看 java.util.Formatter