210.4. Eclipse Kura 组件
从 Camel 2.15 开始提供
本文档页面涵盖 Camel 与 Eclipse Kura M2M 网关的集成选项。将 Camel 路由部署到 Eclipse Kura 的常见原因是向消息传递 M2M 网关提供企业集成模式和 Camel 组件。例如,您可能想要在 Raspberry PI 上安装 Kura,然后从附加到使用 Kura 服务的传感器读取温度,最后使用 Camel EIP 和组件将当前的温度值转发到您的数据中心服务。
210.4.1. KuraRouter activator
部署到 Eclipse Kura 的捆绑包通常作为捆绑包开发。因此,将 Apache Camel 路由部署到 Kura 的最简单方法是将 Apache Camel 路由包含类扩展 org.apache.camel.kura.KuraRouter
类:
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { from("timer:trigger"). to("netty-http:http://app.mydatacenter.com/api"); } }
请记住,K uraRouter
实施 org.osgi.framework.BundleActivator
接口,因此您需要 在创建 Kura 捆绑包组件类时 注册其
生命周期方法。
启动和停止
Kura 路由器开始自己的 OSGi 感知 CamelContext
。这意味着,对于每个类扩展 KuraRouter
,将有一个专用的 CamelContext
实例。理想情况下,我们建议为每个 OSGi 捆绑包部署一个 KuraRouter
。
210.4.2. 部署 KuraRouter
包含 Kura 路由器类的捆绑包应该在 OSGi 清单中导入以下软件包:
Import-Package: org.osgi.framework;version="1.3.0", org.slf4j;version="1.6.4", org.apache.camel,org.apache.camel.impl,org.apache.camel.core.osgi,org.apache.camel.builder,org.apache.camel.model, org.apache.camel.component.kura
请记住,您不必导入您计划在路由中使用的每个 Camel 组件捆绑包,因为 Camel 组件作为运行时级别的服务解决。
在部署路由器捆绑包前,请确定您已部署(并启动)以下 Camel 内核捆绑包(使用 Kura GoGo shell)…
install file:///home/user/.m2/repository/org/apache/camel/camel-core/2.15.0/camel-core-2.15.0.jar start <camel-core-bundle-id> install file:///home/user/.m2/repository/org/apache/camel/camel-core-osgi/2.15.0/camel-core-osgi-2.15.0.jar start <camel-core-osgi-bundle-id> install file:///home/user/.m2/repository/org/apache/camel/camel-kura/2.15.0/camel-kura-2.15.0.jar start <camel-kura-bundle-id>
… 以及您计划在路由中使用的所有组件:
install file:///home/user/.m2/repository/org/apache/camel/camel-stream/2.15.0/camel-stream-2.15.0.jar start <camel-stream-bundle-id>
然后最终部署路由器捆绑包:
install file:///home/user/.m2/repository/com/example/myrouter/1.0/myrouter-1.0.jar start <your-bundle-id>
210.4.3. KuraRouter 工具
Kura router base class provides many useful utilities. This section explores each of them.
210.4.3.1. SLF4J 日志记录器
Kura 使用 SLF4J facade 进行日志记录。保护的成员 日志
会返回与给定 Kura 路由器关联的 SLF4J 日志记录器实例。
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { log.info("Configuring Camel routes!"); ... } }
210.4.3.2. BundleContext
受保护的成员 bundleContext
返回与给定 Kura 路由器关联的捆绑包上下文。
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { ServiceReference<MyService> serviceRef = bundleContext.getServiceReference(LogService.class.getName()); MyService myService = bundleContext.getService(serviceRef); ... } }
210.4.3.3. CamelContext
受保护的成员 camelContext
是与给定 Kura 路由器关联的 CamelContext
。
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { camelContext.getStatus(); ... } }
210.4.3.4. ProducerTemplate
受保护的 member producerTemplate
是与给定 Camel 上下文关联的 ProducerTemplate
实例。
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { producerTemplate.sendBody("jms:temperature", 22.0); ... } }
210.4.3.5. ConsumerTemplate
受保护的成员 consumerTemplate
是与给定 Camel 上下文关联的 ConsumerTemplate
实例。
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { double currentTemperature = producerTemplate.receiveBody("jms:temperature", Double.class); ... } }
210.4.3.6. OSGi 服务解析器
OSGi 服务解析器(服务(Class<T> serviceType)
)可用于通过从 OSGi 捆绑包上下文键入 来轻松地检索服务。
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { MyService myService = service(MyService.class); ... } }
如果没有找到服务,则返回 null
值。如果您希望应用程序失败,如果服务不可用,请使用 requiredService (Class)
方法。如果无法找到服务,则 requiredService
会抛出 IllegalStateException
。
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { MyService myService = requiredService(MyService.class); ... } }
210.4.4. KuraRouter activator 回调
Kura 路由器附带生命周期回调,可用于自定义 Camel 路由器的工作方式。例如,要在启动前配置与路由器关联的 CamelContext
实例,请在 KuraRouter
类的 Start 方法之前
覆盖:
public class MyKuraRouter extends KuraRouter { ... protected void beforeStart(CamelContext camelContext) { OsgiDefaultCamelContext osgiContext = (OsgiCamelContext) camelContext; osgiContext.setName("NameOfTheRouter"); } }
210.4.5. 从 ConfigurationAdmin 加载 XML 路由
有时,需要从服务器配置读取路由的 XML 定义。对于通过无线重新部署成本的 IoT 网关,这种常见场景可能非常显著。为了满足此要求,可使用 OSGi ConfigurationAdmin 的 kura.camel.BUNDLE-SYMBOLIC-NAME.route
属性查找来自 kura.camel
PID 的 kura.camel PID。这种方法允许您为每个部署的
KuraRouter
定义 Camel XML 路由文件。要更新路由,请只编辑适当的配置属性并重启与其关联的捆绑包。kura.camel.BUNDLE-SYMBOLIC-NAME.route
属性的内容应该是 Camel XML 路由文件,例如:
<routes xmlns="http://camel.apache.org/schema/spring"> <route id="loaded"> <from uri="direct:bar"/> <to uri="mock:bar"/> </route> </routes>
210.4.6. 将 Kura 路由器部署为声明性 OSGi 服务
如果您要将 Kura 路由器部署为声明性 OSGi 服务,您可以使用
激活和停用
KuraRouter
提供的方法。
<scr:component name="org.eclipse.kura.example.camel.MyKuraRouter" activate="activate" deactivate="deactivate" enabled="true" immediate="true"> <implementation class="org.eclipse.kura.example.camel.MyKuraRouter"/> </scr:component>
210.4.7. 另请参阅
- 配置 Camel
- 组件
- 端点
- 开始使用