1.4. Endpoints
概述
Apache Camel 端点是路由中消息的源和接收器。端点是非常典型的构建块:它必须满足的唯一要求是它充当消息源(制作者端点)或作为消息接收器(消费者端点)。因此,Apache Camel 支持多种不同端点类型,范围从支持端点(如 HTTP)到简单计时器端点,如 Quartz,它会定期生成 dummy 消息。Apache Camel 的主要优势之一是:添加实施新端点类型的自定义组件相对容易。
端点 URI
端点 URI 识别 端点,它有以下常规形式:
scheme:contextPath[?queryOptions]
URI 架构 标识了一个协议,如 http
,而 contextPath 提供由协议解释的 URI 详情。另外,大多数方案都允许您定义以以下格式指定的 查询选项、查询Options :
?option01=value01&option02=value02&...
例如,以下 HTTP URI 可用于连接到 Google 搜索引擎页面:
http://www.google.com
以下文件 URI 可用于读取出现在 C:\temp\src\data
目录下的所有文件:
file://C:/temp/src/data
并非每个 方案 都代表协议。有时,一种 方案 只能访问有用的实用程序,如计时器。例如,以下 Timer 端点 URI 每秒钟生成一个一次交换(=1000 毫秒)。您可以使用此计划路由中的活动。
timer://tickTock?period=1000
使用 Long 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>
- 跨 New Lines 分割端点配置
您可以使用新行来分割 URI 属性。
<route> <from uri="ftp://foo@myserver?password=secret& recursive=true&ftpClient.dataTimeout=30000& ftpClientConfig.serverLanguageCode=fr"/> <to uri="bean:doSomething"/> </route>
注意您可以在每行中指定一个或多个选项,每个选项用 和 分隔。
在 URI 中指定时间
许多 Apache Camel 组件都有选项,其值为持续时间(例如,指定超时值等等)。默认情况下,此类时间段选项通常指定为纯数字,该数字被解释为毫秒的时间段。但是 Apache Camel 还支持更易读的语法,它可让您以小时、分钟和秒表示周期。正式来说,人类可读的时间段是一个遵循以下语法的字符串:
[NHour(h|hour)][NMin(m|minute)][NSec(s|second)]
在方括号 中每个术语 []
都是可选的,使用符号 (A|B)
,表示 A
和 B
是 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 编码的情况下 传输原始字符字符串。
可以通过使用语法 RAW (RawValue)
指定选项值来关闭 URI 编码。例如,
from("SourceURI") .to("ftp:joe@myftpserver.com?password=RAW(se+re?t&23)&binary=true")
在本例中,密码值将作为字面值传输,se+re?t&23
。
不区分大小写的 enum 选项
某些端点 URI 选项会映射到 Java 枚举常量。例如,Log 组件的
level
选项,该选项可取 enum
值、INFO
、WARN
、WARN、ERROR
等。这个类型转换不区分大小写,因此以下任意备选方案可用于设置 Log producer 端点的日志级别:
<to uri="log:foo?level=info"/> <to uri="log:foo?level=INfo"/> <to uri="log:foo?level=InFo"/>
指定 URI 资源
从 Camel 2.17 中,基于 XSLT 等资源的组件可以使用 ref:
作为前缀,从注册表加载资源文件。
例如,如果myvelocityscriptbean
和 mysimplescriptbean
是注册表中两个 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 提供各种不同组件,允许您将应用程序与各种传输协议和第三方产品集成。例如,一些常用的组件有:文件、JMS、CXF (Web 服务)、HTTP、Jetty、Direct 和 Mock。有关支持组件的完整列表,请参阅 Apache Camel 组件文档。
大多数 Apache Camel 组件单独打包到 Camel 内核。如果使用 Maven 构建应用程序,您可以轻松地将组件(及其第三方依赖项)添加到应用程序中,只需添加对相关组件工件的依赖。例如,要包含 HTTP 组件,您可以在项目 POM 文件中添加以下 Maven 依赖项:
<!-- 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-core
构件中),因此它们始终可用:
- bean
- 浏览
- dataset
- 直接
- File
- Log
- Mock
- Properties
- Ref
- SEDA
- timer
- VM
消费者端点
消费者端点 是在路由 开始时 出现的端点(即,在 from ()
DSL 命令中)。换句话说,使用者端点负责在路由内启动处理:它创建新的交换实例(通常基于它接收或获取的一些消息),并提供线程来处理路由的其余部分中的交换。
例如,以下 JMS consumer 端点从 支付
队列拉取消息,并在路由中处理消息:
from("jms:queue:payments") .process(SomeProcessor) .to("TargetURI");
在 Spring XML 中,或等效于 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>
有些组件 只是消费者 ,它们只能用来定义消费者端点。例如,Qartz 组件专门用来定义消费者端点。以下 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 命令中)。换句话说,生产者端点接收现有的 Exchange 对象,并将交换的内容发送到指定的端点。
例如,以下 JMS producer 端点将当前交换的内容推送到指定的 JMS 队列中:
from("SourceURI") .process(SomeProcessor) .to("jms:queue:orderForms");
在 Spring XML 中,或等效于 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。