46.4. 编程模型

概述

在 API 组件框架上下文中,主要组件实施类派生自 org.apache.camel.util.component 软件包的基本类。这些基本类定义了在实施组件时您可以(可选)覆盖的一些方法。在本节中,我们提供了这些方法的简短描述,以及如何在您自己的组件实施中使用它们。

实施的组件方法

除了生成的方法实现外(您通常不需要修改),您可以在 组件 类中选择性地覆盖其中一些方法:

doStart()
(可选) 回调,在冷启动期间为组件创建资源。另一种方法是采用 lazy 初始化 策略(仅在需要资源时重新创建)。事实上,lazy 初始化通常是最佳策略,因此通常不需要 doStart 方法。
doStop()

(可选) 在组件停止期间调用代码的回调。停止组件意味着其所有资源都会关闭,内部状态被删除,缓存会被清除,以此类推。

注意

Camel 保证在当前的 CamelContext 关闭时始终调用 doStop,即使对应的 doStart 永不被调用。

doShutdown
(可选)CamelContext 关闭期间调用代码的回调。虽然可以重新启动停止的组件(冷启动语义),而关闭的组件便已完全完成。因此,这个回调代表了释放属于该组件的任何资源的最后几率。

在组件类中实施哪些其他因素?

组件 类是保存对组件对象本身有相同(或类似)生命周期的引用的自然的地方。例如,如果组件使用 OAuth 安全性,则自然会保存对 component 类中所需 OAuth 对象的引用,并在 组件 类中定义方法以创建 OAuth 对象。

实施的端点方法

您可以修改一些生成的方法,并选择性地覆盖 Endpoint 类中一些继承的方法,如下所示:

afterConfigureProperties()

在此方法中您需要执行的主要操作是创建适当的代理类(API 类)来匹配 API 名称。API 名称(已经从端点 URI 中提取)可以通过继承的 apiName 字段或通过 getApiName accessor 获取。通常,您需要在 apiName 字段中执行交换机来创建对应的代理类。例如:

// Java
private Object apiProxy;
...
@Override
protected void afterConfigureProperties() {
    // TODO create API proxy, set connection properties, etc.
    switch (apiName) {
        case HELLO_FILE:
            apiProxy = new ExampleFileHello();
            break;
        case HELLO_JAVADOC:
            apiProxy = new ExampleJavadocHello();
            break;
        default:
            throw new IllegalArgumentException("Invalid API name " + apiName);
    }
}
getApiProxy (ApiMethod 方法, Map<String, Object> args)

覆盖此方法,返回您在 afterConfigureProperties 中创建的代理实例。例如:

@Override
public Object getApiProxy(ApiMethod method, Map<String, Object> args) {
    return apiProxy;
}

特殊情况下,您可能想要选择代理取决于 API 方法和参数。getApiProxy 为您提供了在必要时使用此方法的灵活性。

doStart()
(可选) 用于在冷启动期间创建资源的回调。与 Component.doStart () 相同的语义。
doStop()
(可选) 在组件停止期间调用代码的回调。使用与 Component.doStop () 相同的语义。
doShutdown
(可选) 在组件关闭时调用代码的回调。与 Component.doShutdown () 相同的语义。
interceptPropertyNames (Set<String> propertyNames)

(可选) API 组件框架使用端点 URI 和提供选项值来决定要调用的方法(模糊的可能是由于过载和别名造成的)。但是,如果组件内部添加选项或方法参数,则框架可能需要帮助来确定要调用的正确方法。在这种情况下,您必须覆盖 interceptPropertyNames 方法,并将额外的(隐藏或隐式)选项添加到 属性名称 集。在 attribute Names 集合中提供方法参数的完整列表时,该框架将能够识别要调用的正确方法。

注意

您可以在 EndpointProducerConsumer 类的级别上覆盖此方法。如果 选项 同时 影响制作者端点和消费者端点,则基本规则是覆盖 Endpoint 类中的方法。

interceptProperties (Map<String,Object> properties)

(可选) 通过覆盖此方法,您可以在调用 API 方法前修改或设置选项的实际值。例如,如果需要,您可以使用此方法为某些选项设置默认值。在实践中,通常需要覆盖 intercept Property Names 方法和 interceptProperty 方法。

注意

您可以在 EndpointProducerConsumer 类的级别上覆盖此方法。如果 选项 同时 影响制作者端点和消费者端点,则基本规则是覆盖 Endpoint 类中的方法。

实施的消费者方法

您可以选择在 Consumer 类中覆盖一些继承的方法,如下所示:

interceptPropertyNames (Set<String> propertyNames)
(可选) 此方法的语义与 Endpoint.interceptPropertyNames类似
interceptProperties (Map<String,Object> properties)
(可选) 此方法的语义与 Endpoint.interceptProperties类似
doInvokeMethod(Map<String, Object> args)

(可选) 覆盖此方法可让您截获 Java API 方法的调用。覆盖此方法的最常见原因是自定义有关方法调用的错误处理。例如,以下代码片段中显示了覆盖 doInvokeMethod 的典型方法:

// Java
@Override
protected Object doInvokeMethod(Map<String, Object> args) {
    try {
        return super.doInvokeMethod(args);
    } catch (RuntimeCamelException e) {
        // TODO - Insert custom error handling here!
        ...
    }
}

在实施的某个时候,您应该在超级类上调用 doInvokeMethod,以确保 Java API 方法被调用。

拦截器(Object methodResult, Exchange resultExchange)
(可选) 对 API 方法调用的结果进行一些额外的处理。例如,您可以在 Camel Exchange 对象中添加自定义标头,即此时的 results Exchange
对象 splitResult (Object 结果)

(可选) 默认情况下,如果方法 API 调用的结果是 java.util.Collection 对象或 Java 数组,API 组件框架会将结果分成多个交换对象(因此单个调用结果转换为多个消息)。

如果要更改默认的行为,可以覆盖消费者端点中的 splitResult 方法。result 参数包含 API 消息调用的结果。如果要分割结果,您应该返回数组类型。

注意

您还可以通过在端点 URI 中设置 consumer.splitResult=false 来关闭默认拆分行为。

实施的制作方法

您可以选择在 Producer 类中覆盖一些继承的方法,如下所示:

interceptPropertyNames (Set<String> propertyNames)
(可选) 此方法的语义与 Endpoint.interceptPropertyNames类似
interceptProperties (Map<String,Object> properties)
(可选) 此方法的语义与 Endpoint.interceptProperties类似
doInvokeMethod(Map<String, Object> args)
(可选) 此方法的语义与 Consumer.doInvokeMethod 类似。
拦截器(Object methodResult, Exchange resultExchange)
(可选) 此方法的语义与 Consumer.interceptResult 类似。
注意

Producer.splitResult () 方法 不会被 调用,因此无法分割 API 方法的结果与消费者端点相同。要获得类似制作者端点的效果,您可以使用 Camel 的 split () DSL 命令(标准企业集成模式之一)来分割 集合 或阵列结果。

消费者轮询和线程模型

API 组件框架中消费者端点的默认线程模型被 调度轮询使用者。这意味着使用者端点中的 API 方法会定期调用调度的时间间隔。如需了解更多详细信息,请参阅 “调度的轮询消费者实施”一节