搜索

46.4. 编程模型

download PDF

概述

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

要实现的组件方法

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

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

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

注意

Camel 保证当当前 CamelContext 关闭时 始终 调用 doStop,即使未调用对应的 doStart

doShutdown
(可选)CamelContext 关闭时调用代码的回调。已停止的组件可以重新启动(使用冷启动语义),而关闭的组件将完全完成。因此,此回调代表最后一次释放属于组件的任何资源的机会。

组件类中实施哪些其他内容?

组件 类是包含对组件对象本身相同(或类似)生命周期的对象的引用。例如,如果组件使用 OAuth 安全性,则最好在 组件 类中包含对所需 OAuth 对象的引用,并在 Component 类中定义用于创建 OAuth 对象的方法。

要实现的端点方法

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

afterConfigureProperties()

此方法中需要做的主要事情是创建适当的代理类(API 类),以匹配 API 名称。API 名称(已从端点 URI 中提取)可以通过继承的 apiName 字段或通过 getApiName 访问器提供。通常,您将在 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 method, 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 方法,并将额外的(hidden 或 implicit)选项添加到 propertyNames 集。当设置 propertyNames 中提供了方法参数的完整列表时,框架将能够识别要调用的正确方法。

注意

您可以在 Endpoint,ProducerConsumer 类级别上覆盖此方法。基本规则是,如果选项影响 生成者 端点和消费者端点,请覆盖 Endpoint 类中的方法。

interceptProperties (Map<String,Object> 属性)

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

注意

您可以在 Endpoint,ProducerConsumer 类级别上覆盖此方法。基本规则是,如果选项影响 生成者 端点和消费者端点,请覆盖 Endpoint 类中的方法。

实施的消费者方法

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

interceptPropertyNames (Set<String> propertyNames)
(可选) 此方法的语义与 Endpoint.interceptPropertyNames类似
interceptProperties (Map<String,Object> 属性)
(可选) 此方法的语义与 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 方法。

interceptResult (Object methodResult, Exchange resultExchange)
(可选) 对 API 方法调用的结果执行一些额外的处理。例如,您可以在 Camel Exchange 对象中添加自定义标头 resultExchange
Object splitResult (Object result)

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

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

注意

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

要实现的生成者方法

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

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

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

消费者轮询和线程模型

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.