46.3. 生成的组件子项目
概述 复制链接链接已复制到粘贴板!
用于构建新组件的 Maven 子项目位于 camel-api-example/camel-api-example-component 项目目录下。在本节中,我们会仔细查看生成的示例代码,并描述其工作原理。
在组件 POM 中提供 Java API 复制链接链接已复制到粘贴板!
Java API 必须作为组件 POM 中的依赖项提供。例如,示例 Java API 在组件 POM 文件中定义为依赖项,cal -api-example-component/pom.xml 如下:
在组件 POM 中提供 Javadoc 元数据 复制链接链接已复制到粘贴板!
如果您使用 Java API 的所有或部分的 Javadoc 元数据,则必须在组件 POM 中以依赖项形式提供 Javadoc。关于这个依赖关系,有两个问题:
Javadoc 的 Maven 协调几乎和 Java API 相同,但您还必须指定类
符元素,如下所示:<classifier>javadoc</classifier>
<classifier>javadoc</classifier>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您必须声明 Javadoc 以
提供范围,如下所示:<scope>provided</scope>
<scope>provided</scope>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例如,在组件 POM 中,Javadoc 依赖项定义如下:
为示例文件 Hello 定义文件元数据 复制链接链接已复制到粘贴板!
ExampleFileHello 的元数据在签名文件中提供。通常,必须手动创建此文件,但是它的格式非常简单,它由一个方法签名列表(每行一个)组成。示例代码在 目录中提供了签名文件 file-sig ,它包含以下内容:
-api.txt
public String sayHi(); public String greetMe(String name); public String greetUs(String name1, String name2);
public String sayHi();
public String greetMe(String name);
public String greetUs(String name1, String name2);
有关签名文件格式的详情,请参考 “签名文件元数据”一节。
配置 API 映射 复制链接链接已复制到粘贴板!
API 组件框架的主要功能之一是它自动生成代码来执行 API 映射。也就是说,生成存根代码,将端点 URI 映射到 Java API 上调用的方法。API 映射的基本输入有:Java API、Javadoc 元数据和/或签名文件元数据。
执行 API 映射的组件是 camel-api-component-maven-plugin Maven 插件,它在组件 POM 中配置。以下从组件 POM 中提取的显示了如何配置 camel-api-component-maven-plugin 插件:
该插件由 configuration 元素配置,其中包含一个 apis 子元素来配置 Java API 类。每个 API 类都由一个 api 元素配置,如下所示:
apiNameAPI 名称是 API 类的简短名称,用作
端点 URI 的端点前缀部分。注意如果 API 只包含一个 Java 类,您可以将
apiName元素留空,以便endpoint-prefix变为冗余,您可以使用 “单个 API 类的 URI 格式”一节 所示的格式指定端点 URI。proxyClass- proxy class 元素指定 API 类的完全限定名称。
fromJavadoc-
如果 API 类由 Javadoc 元数据提供,您必须通过包含
fromJavadoc元素和 Javadoc 本身在 Maven 文件中指定它,作为提供的依赖项(请参阅 “在组件 POM 中提供 Javadoc 元数据”一节)。 fromSignatureFile如果 API 类使用签名文件元数据,您必须通过包含
fromSignatureFile元素来指明这一点,此元素的内容指定了签名文件的位置。注意签名文件不包括在 Maven 构建的最终软件包中,因为这些文件仅在构建时不需要。
生成的组件实施 复制链接链接已复制到粘贴板!
API 组件由以下核心类(必须为每个 Camel 组件实施)位于 camel-api-example-component/src/main/java 目录下:
Component 示例-
代表组件本身。此类充当端点实例的工厂(如
ExampleEndpoint的实例)。 示例Endpoint-
代表端点 URI。此类充当消费者端点的工厂(例如,
ExampleConsumer)和制作者端点的工厂(如示例Producer)。 Consumer 示例- 代表消费者端点的声明实例,该端点能够使用来自端点 URI 中指定的位置的消息。
Producer 示例- 代表制作者端点的 concrete 实例,它能够将消息发送到端点 URI 中指定的位置。
ExampleConfiguration可用于定义端点 URI 选项。此配置类定义的 URI 选项 不 绑定到任何特定的 API 类。也就是说,您可以将这些 URI 选项与任何 API 类或方法组合。例如,如果您需要声明用户名和密码凭证才能连接到远程服务,这将会很有用。
ExampleConfiguration类的主要目的是提供实例化 API 类或实施 API 接口所需的参数的值。例如,这些可以是构造参数,也可以是工厂方法或类的参数值。要实现 URI 选项(在这一类中),您需要做的所有选项都是实施访问器方法对,
获取选项和设置选项。组件框架自动解析端点 URI,并在运行时注入选项值。
Component 类示例 复制链接链接已复制到粘贴板!
生成的 ExampleComponent 类定义如下:
此类中的重要方法是 createEndpoint,它用于创建新的端点实例。通常,您不需要更改组件类中的任何默认代码。但是,如果存在与这个组件相同的生命周期其他任何对象,您可能想让这些对象从组件类访问(例如,通过添加方法来创建这些对象或通过将这些对象注入组件)。
ExampleEndpoint 类 复制链接链接已复制到粘贴板!
生成的 ExampleEndpoint 类定义如下:
在 API 组件框架的上下文中,端点类执行的一个关键步骤之一是创建 API 代理。API 代理是一个来自目标 Java API 的实例,其方法由端点调用。因为 Java API 通常由多个类组成,因此需要根据 URI 中出现的端点 前缀 来选择适当的 API 类(所有 URI 具有常规形式,方案://端点前缀/端点)。
Consumer 类示例 复制链接链接已复制到粘贴板!
生成的 ExampleConsumer 类定义如下:
Producer 类示例 复制链接链接已复制到粘贴板!
生成的 ExampleProducer 类定义如下:
ExampleConfiguration 类 复制链接链接已复制到粘贴板!
生成的 ExampleConfiguration 类定义如下:
要添加 URI 选项( 选择 )到此类中,定义相应类型的字段,并实施对应的访问器方法、获取选项和设置选项。 组件框架自动解析端点 URI,并在运行时注入选项值。
这个类用于定义 常规 URI 选项,可以与任何 API 方法相结合。要定义与特定 API 方法关联的 URI 选项,在 API 组件 Maven 插件中配置额外的选项。详情请查看 第 47.7 节 “额外选项”。
URI 格式 复制链接链接已复制到粘贴板!
重新调用 API 组件 URI 的一般格式:
scheme://endpoint-prefix/endpoint?Option1=Value1&...&OptionN=ValueN
scheme://endpoint-prefix/endpoint?Option1=Value1&...&OptionN=ValueN
通常,URI 映射到 Java API 上的特定方法调用。例如,假设您要调用 API 方法,ExampleJavadocHello.greetMe("Jane Doe") 将被构造 URI,如下所示:
- scheme
-
API 组件方案,如使用 Maven archetype 生成代码时所指定。在这种情况下,方案是
示例。 - endpoint-prefix
API 名称,它映射到由
camel-api-component-maven-pluginMaven 插件配置定义的 API 类。对于ExampleJavadocHello类,相关配置为:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这表明所需的
endpoint-prefix是hello-javadoc。- 端点
-
端点映射到方法名称,即greetMe。 - Option1=Value1
-
URI 选项指定方法参数。
greetMe(String name)方法采用单一参数,即名称,它可以指定为name=Jane%20Doe。如果要为选项定义默认值,可以通过覆盖interceptProperties方法(请参阅 第 46.4 节 “编程模型”)。
将 URI 的片段放在一起,我们可以看到您可以使用以下 URI 调用 ExampleJavadocHello.greetMe("Jane Doe") :
example://hello-javadoc/greetMe?name=Jane%20Doe
example://hello-javadoc/greetMe?name=Jane%20Doe
默认组件实例 复制链接链接已复制到粘贴板!
要将 示例 URI 方案映射到默认组件实例,Maven archetype 会在 camel-api-example-component 子项目下创建以下文件:
src/main/resources/META-INF/services/org/apache/camel/component/example
src/main/resources/META-INF/services/org/apache/camel/component/example
此资源文件是什么使 Camel 内核能够识别与 示例 URI 方案关联的组件。每当您在路由中使用 example:// URI 时,Camel 都会搜索 classpath 以查找对应的 示例 资源文件。示例文件 包含以下内容:
class=org.jboss.fuse.example.ExampleComponent
class=org.jboss.fuse.example.ExampleComponent
这可让 Camel 核心创建 ExampleComponent 组件的默认实例。如果您重构了组件类的名称,您需要编辑此文件的唯一时间。