第94章 Kura
Kura コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Kura コンポーネントは、Camel 2.15 以降で利用できます。
このドキュメントページでは、Camel と Eclipse Kura M2M ゲートウェイの統合オプションについて説明します。Camel ルートを Eclipse Kura にデプロイする一般的な理由は、エンタープライズ統合パターンと Camel コンポーネントをメッセージング M2M ゲートウェイに提供することです。たとえば、Rusberry PI に Kura をインストールし、Kura サービスを使用してその Raspberry PI に接続されているセンサーから温度を読み、最後に Camel EIP およびコンポーネントを使用して現在の温度値をデータセンターサービスに転送する場合があります。
KuraRouter activator リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Eclipse Kura にデプロイされたバンドルは通常、バンドルアクティベーターとして開発され ます。そのため、Apache Camel ルートを Kura にデプロイする最も簡単な方法は、拡張
org.apache.camel.kura.KuraRouter クラスを含む OSGi バンドルを作成することです。
public class MyKuraRouter extends KuraRouter {
@Override
public void configure() throws Exception {
from("timer:trigger").
to("netty-http:http://app.mydatacenter.com/api");
}
}
KuraRouter は org.osgi.framework.BundleActivator インターフェイスを実装しているため、Kura バンドルコンポーネントクラス start および stop のライフサイクルメソッドを登録する必要があります。
Kura ルーターは独自の OSGi 対応の
CamelContext を起動します。これは、KuraRouter を拡張するすべてのクラスに対して、専用の CamelContext インスタンスがあることを意味します。理想的には、OSGi バンドルごとに KuraRouter をデプロイすることが推奨されます。
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 シェルを使用)していることを確認してください。
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>
KuraRouter ユーティリティー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Kura ルーターベースクラスは多くの便利なユーティリティーを提供します。本セクションでは、各項目を取り上げます。
SLF4J ロガー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Kura はロギング目的で SLF4J ファサードを使用します。protected member
log は、指定の Kura ルーターに関連付けられた SLF4J ロガーインスタンスを返します。
public class MyKuraRouter extends KuraRouter {
@Override
public void configure() throws Exception {
log.info("Configuring Camel routes!");
...
}
}
BundleContext リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
protected member
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);
...
}
}
CamelContext リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
protected member
camelContext は、指定の Kura ルーターに関連付けられた CamelContext です。
public class MyKuraRouter extends KuraRouter {
@Override
public void configure() throws Exception {
camelContext.getStatus();
...
}
}
ProducerTemplate リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
protected member
producerTemplate は、指定の Camel コンテキストに関連付けられた ProducerTemplate インスタンスです。
public class MyKuraRouter extends KuraRouter {
@Override
public void configure() throws Exception {
producerTemplate.sendBody("jms:temperature", 22.0);
...
}
}
ConsumerTemplate リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
protected member
consumerTemplate は、指定の Camel コンテキストに関連付けられた ConsumerTemplate インスタンスです。
public class MyKuraRouter extends KuraRouter {
@Override
public void configure() throws Exception {
producerTemplate.sendBody("jms:temperature", 22.0);
...
}
}
OSGi サービスリゾルバー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
OSGi サービスリゾルバー(
service(Class<T> serviceType))を使用して、OSGi バンドルコンテキストからタイプでサービスを簡単に取得できます。
public class MyKuraRouter extends KuraRouter {
@Override
public void configure() throws Exception {
MyService myService = service(MyService.class);
...
}
}
service が見つからない場合は、
null 値が返されます。サービスが利用できない場合にアプリケーションが失敗する場合は、代わりに requiredService(Class) メソッドを使用します。サービスが見つからない場合、requiredService は IllegalStateException を出力します。
public class MyKuraRouter extends KuraRouter {
@Override
public void configure() throws Exception {
MyService myService = requiredService(MyService.class);
...
}
}
KuraRouter アクティベーターコールバック リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Kura ルーターには、Camel ルーターの動作方法をカスタマイズするために使用できるライフサイクルコールバックが含まれています。たとえば、以前の起動直前にルーターに関連付けられた
CamelContext インスタンスを設定するには、KuraRouter クラスの beforeStart メソッドを上書きします。
public class MyKuraRouter extends KuraRouter {
...
protected void beforeStart(CamelContext camelContext) {
OsgiDefaultCamelContext osgiContext = (OsgiCamelContext) camelContext;
osgiContext.setName("NameOfTheRouter");
}
}
ConfigurationAdmin からの XML ルートの読み込み リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
サーバー設定からルートの XML 定義を読み取る必要がある場合があります。この IoT ゲートウェイでは、無線の再デプロイメントコストが大きくなる可能性があるという一般的なシナリオになります。この要件に対応するには、
KuraRouter が OSGi ConfigurationAdmin を使用して、kura.camel PID から kura.camel.BUNDLE-SYMBOLIC-NAME.route プロパティーを検索します。この方法では、デプロイされた 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>
宣言型 OSGi サービスとして Kura ルーターをデプロイする リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Kura ルーターを宣言型 OSGi サービスとしてデプロイする場合は、
KuraRouter で提供される activate および deactivate メソッドを使用できます。
<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>