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字段或通过getApiNameaccessor 获取。通常,您需要在apiName字段中执行交换机来创建对应的代理类。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow getApiProxy (ApiMethod 方法, Map<String, Object> args)覆盖此方法,返回您在
afterConfigureProperties中创建的代理实例。例如:@Override public Object getApiProxy(ApiMethod method, Map<String, Object> args) { return apiProxy; }@Override public Object getApiProxy(ApiMethod method, Map<String, Object> args) { return apiProxy; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 特殊情况下,您可能想要选择代理取决于 API 方法和参数。
getApiProxy为您提供了在必要时使用此方法的灵活性。doStart()-
(可选) 用于在冷启动期间创建资源的回调。与
Component.doStart ()相同的语义。 doStop()-
(可选) 在组件停止期间调用代码的回调。使用与
Component.doStop ()相同的语义。 doShutdown-
(可选) 在组件关闭时调用代码的回调。与
Component.doShutdown ()相同的语义。 interceptPropertyNames (Set<String> propertyNames)(可选) API 组件框架使用端点 URI 和提供选项值来决定要调用的方法(模糊的可能是由于过载和别名造成的)。但是,如果组件内部添加选项或方法参数,则框架可能需要帮助来确定要调用的正确方法。在这种情况下,您必须覆盖
interceptPropertyNames方法,并将额外的(隐藏或隐式)选项添加到属性名称集。在 attributeNames集合中提供方法参数的完整列表时,该框架将能够识别要调用的正确方法。注意您可以在
Endpoint、Producer或Consumer类的级别上覆盖此方法。如果 选项 同时 影响制作者端点和消费者端点,则基本规则是覆盖Endpoint类中的方法。interceptProperties (Map<String,Object> properties)(可选) 通过覆盖此方法,您可以在调用 API 方法前修改或设置选项的实际值。例如,如果需要,您可以使用此方法为某些选项设置默认值。在实践中,通常需要覆盖
intercept方法和 interceptProperty 方法。PropertyNames注意您可以在
Endpoint、Producer或Consumer类的级别上覆盖此方法。如果 选项 同时 影响制作者端点和消费者端点,则基本规则是覆盖Endpoint类中的方法。
实施的消费者方法 复制链接链接已复制到粘贴板!
您可以选择在 Consumer 类中覆盖一些继承的方法,如下所示:
interceptPropertyNames (Set<String> propertyNames)-
(可选) 此方法的语义与
Endpoint.interceptPropertyNames类似 interceptProperties (Map<String,Object> properties)-
(可选) 此方法的语义与
Endpoint.interceptProperties类似 doInvokeMethod(Map<String, Object> args)(可选) 覆盖此方法可让您截获 Java API 方法的调用。覆盖此方法的最常见原因是自定义有关方法调用的错误处理。例如,以下代码片段中显示了覆盖
doInvokeMethod的典型方法:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在实施的某个时候,您应该在超级类上调用
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 方法会定期调用调度的时间间隔。如需了解更多详细信息,请参阅 “调度的轮询消费者实施”一节。