12.6. 与 Apache Camel 集成
12.6.1. 概述 复制链接链接已复制到粘贴板!
Apache Camel 提供了使用 Bean 语言调用 OSGi 服务的简单方法。当 Apache Camel 应用程序部署到 OSGi 容器中且不需要特殊配置时,此功能会自动可用。
12.6.2. registry 链 复制链接链接已复制到粘贴板!
当 Apache Camel 路由部署到 OSGi 容器中时,CamelContext 会自动设置用于解析 bean 实例的 registry 链:registry 链由 OSGi 注册表组成,后跟 Blueprint registry。现在,如果您尝试引用特定的 bean 类或 bean 实例,registry 会解析 bean,如下所示:
- 首先在 OSGi 注册表中查找 bean。如果指定了类名称,请尝试与 OSGi 服务的接口或类匹配。
- 如果在 OSGi 注册中心中没有找到匹配项,请回退到 Blueprint registry。
12.6.3. OSGi 服务接口示例 复制链接链接已复制到粘贴板!
考虑由以下 Java 接口定义的 OSGi 服务,它定义了单一方法 getGreeting ()
:
package org.fusesource.example.hello.boston; public interface HelloBoston { public String getGreeting(); }
package org.fusesource.example.hello.boston;
public interface HelloBoston {
public String getGreeting();
}
12.6.4. 服务导出示例 复制链接链接已复制到粘贴板!
在定义实现 HelloBoston
OSGi 服务的捆绑包时,您可以使用以下 Blueprint 配置导出服务:
假设 HelloBoston
接口由 HelloBostonImpl
类(未显示)实现。
12.6.5. 从 Java DSL 调用 OSGi 服务 复制链接链接已复制到粘贴板!
部署包含 HelloBoston
OSGi 服务的捆绑包后,您可以使用 Java DSL 从 Apache Camel 应用程序调用该服务。在 Java DSL 中,您可以通过 Bean 语言调用 OSGi 服务,如下所示:
from("timer:foo?period=5000") .bean(org.fusesource.example.hello.boston.HelloBoston.class, "getGreeting") .log("The message contains: ${body}")
from("timer:foo?period=5000")
.bean(org.fusesource.example.hello.boston.HelloBoston.class, "getGreeting")
.log("The message contains: ${body}")
在 bean
命令中,第一个参数是 OSGi 接口或类,它必须与从 OSGi 服务捆绑包导出的接口匹配。第二个参数是您要调用的 bean 方法的名称。有关 bean
命令语法的详情,请参阅 Apache Camel 开发指南 Bean 集成。
使用这种方法时,将隐式导入 OSGi 服务。在这种情况下,不需要显式 导入 OSGi 服务。
12.6.6. 从 XML DSL 调用 OSGi 服务 复制链接链接已复制到粘贴板!
在 XML DSL 中,您还可以使用 Bean 语言调用 HelloBoston
OSGi 服务,但语法略有不同。在 XML DSL 中,您可以使用 method
元素通过 Bean 语言调用 OSGi 服务,如下所示:
使用这种方法时,将隐式导入 OSGi 服务。在这种情况下,不需要显式 导入 OSGi 服务。