39.2. 实施组件接口


DefaultComponent 类

您可以通过扩展 org.apache.camel.impl.DefaultComponent 类来实施新组件,它为某些方法提供了一些标准功能和默认实施。特别是,DefaultComponent 类提供对 URI 解析和创建调度 执行器(用于调度的 轮询模式)的支持。

URI 解析

base 组件接口中定义的 createEndpoint (String uri) 方法取完整的未解析端点 URI 作为其唯一参数。另一方面,DefaultComponent 类定义了具有以下签名的 createEndpoint () 方法的三参数版本:

protected abstract Endpoint createEndpoint(
    String uri,
    String remaining,
    Map parameters
)
throws Exception;

URI 是原始的、未解析的 URI; 剩余的 URI 在开始操作后一直从组件前缀中剥离,并在结尾剪切查询选项; 参数 包含解析的查询选项。这是 这是从 DefaultComponent 继承时必须覆盖的 createEndpoint () 方法的版本。这样做的好处是已为您解析端点 URI。

以下文件组件的端点 URI 示例显示 URI 解析在实践中如何工作:

file:///tmp/messages/foo?delete=true&moveNamePostfix=.old

对于这个 URI,以下参数会传递到 createEndpoint () 的三参数版本:

参数示例值

uri

file:///tmp/messages/foo?delete=true&moveNamePostfix=.old

剩余

/tmp/messages/foo

parameters

java.util.Map 中设置了两个条目:

  • 参数 delete 为 boolean true
  • 参数 moveNamePostfix 具有字符串值 .old

参数注入

默认情况下,从 URI 查询选项中提取的参数会在端点的 bean 属性上注入。DefaultComponent 类会自动为您注入参数。

例如,如果要定义支持两个 URI 查询选项的自定义端点: 删除和 moveNamePostfix。所有工作都必须在端点类中定义对应的 bean 方法(getters 和 setters):

public class FileEndpoint extends ScheduledPollEndpoint {
    ...
    public boolean isDelete() {
        return delete;
    }
    public void setDelete(boolean delete) {
        this.delete = delete;
    }
    ...
    public String getMoveNamePostfix() {
        return moveNamePostfix;
    }
    public void setMoveNamePostfix(String moveNamePostfix) {
        this.moveNamePostfix = moveNamePostfix;
    }
}

也可以将 URI 查询选项注入到 消费者 参数中。详情请查看 “consumer 参数注入”一节

禁用端点参数注入

如果您的 Endpoint 类中没有定义参数,您可以通过禁用端点参数注入来优化端点创建过程。要在端点上禁用参数注入,请覆盖 useIntrospectionOnEndpoint () 方法并返回 false,如下所示:

protected boolean useIntrospectionOnEndpoint() {
  return false;
}
注意

useIntrospectionOnEndpoint () 方法 不会影响在 Consumer 类上执行的参数注入。该级别上的参数注入由 Endpoint.configureProperties () 方法控制。(请参阅 第 40.2 节 “实施端点接口”)。

调度的 executor 服务

调度的 executor 在调度轮询模式中使用,它负责推动消费者端点的定期轮询(调度的执行器实际上是一个线程池的实施)。

要实例化调度的 executor 服务,请使用 CamelContext.getExecutorServiceStrategy () 方法返回的 ExecutorServiceStrategy 对象。有关 Apache Camel 线程模型的详情,请参考 第 2.8 节 “线程模型”

注意

在 Apache Camel 2.3 之前,DefaultComponent 类提供了一个 getExecutorService () 方法来创建线程池实例。但是,自 2.3 起,创建线程池现在由 ExecutorServiceStrategy 对象集中管理。

验证 URI

如果要在创建端点实例前验证 URI,您可以覆盖 DefaultComponent 类中的 validateURI () 方法,该类具有以下签名:

protected void validateURI(String uri,
                           String path,
                           Map parameters)
   throws ResolveEndpointFailedException;

如果提供的 URI 没有所需的格式,则 validateURI () 的实现应抛出 org.apache.camel.ResolveEndpointFailedException 异常。

创建端点

例 39.2 “创建Endpoint ()的实现 概述了如何实施 DefaultComponent.createEndpoint () 方法,它负责根据需要创建端点实例。

例 39.2. 创建Endpoint ()的实现

public class CustomComponent extends DefaultComponent { 1
    ...
    protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception { 2
        CustomEndpoint result = new CustomEndpoint(uri, this); 3
        // ...
        return result;
    }
}
1
CustomComponent 是自定义组件类的名称,通过扩展 DefaultComponent 类来定义。
2
在扩展 DefaultComponent 时,您必须使用三个参数实现 createEndpoint () 方法(请参阅 “URI 解析”一节)。
3
通过调用其构造器来创建自定义端点类型 CustomEndpoint 的实例。至少,这个构造器会取原始 URI 字符串、uri 以及对此组件实例的引用的副本。

Example

例 39.3 “FileComponent 实施” 显示 FileComponent 类的示例实现。

例 39.3. FileComponent 实施

package org.apache.camel.component.file;

import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
import org.apache.camel.impl.DefaultComponent;

import java.io.File;
import java.util.Map;

public class FileComponent extends DefaultComponent {
    public static final String HEADER_FILE_NAME = "org.apache.camel.file.name";

    public FileComponent() { 1
    }

    public FileComponent(CamelContext context) { 2
        super(context);
    }

    protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception { 3
        File file = new File(remaining);
        FileEndpoint result = new FileEndpoint(file, uri, this);
        return result;
    }
}
1
始终为组件类定义 no-argument 构造器,以方便自动实例化类。
2
通过编程创建组件实例时,可以将父 CamelContext 实例用作参数的构造器比较方便。
3
FileComponent.createEndpoint () 方法的实现遵循 例 39.2 “创建Endpoint ()的实现 中描述的模式。实施会创建一个 FileEndpoint 对象。

SynchronizationRouteAware Interface

借助 SynchronizationRouteAware 接口,您可以在交换被路由前和之后有回调。

  • onBeforeRoute :在交换被给定路由路由之前被调用。但是,如果在启动路由后将 SynchronizationRouteAware 实施添加到 UnitOfWork,则这个回调可能无法被调用。
  • onAfterRoute :在给定路由路由交换后调用。但是,如果交换通过多个路由路由,则会为每个路由生成调用后端。

    这个调用会在这些回调前发生:

    1. 路由使用者会将任何回复写入调用者(如果在非 超出 模式中)
    2. unit OfWork 通过调用 Synchronization.onComplete (org.apache.camel.Exchange)Synchronization.onFailure (org.apache.camel.Exchange)
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.