12.6. Apache Camel との統合
12.6.1. 概要
Apache Camel は、Bean 言語を使用して OSGi サービスを簡単に呼び出す方法を提供します。この機能は、Apache Camel アプリケーションが OSGi コンテナーにデプロイされ、特別な設定を必要としない場合は常に自動的に使用可能になります。
12.6.2. レジストリーチェーン
Apache Camel ルートが OSGi コンテナーにデプロイされると、CamelContext
が Bean インスタンスの解決のためにレジストリーチェーンを自動的に設定します。レジストリーチェーンは OSGi レジストリーとそれに続く Blueprint レジストリーで構成されます。ここで、特定の Bean クラスまたは Bean インスタンスを参照しようとすると、レジストリーは Bean を次のように解決します。
- 最初に OSGi レジストリーで Bean を検索します。クラス名が指定されている場合は、これを OSGi サービスのインターフェイスまたはクラスと同じにしてください。
- OSGi レジストリーに一致するものが見つからない場合は、Blueprint レジストリーにフォールバックします。
12.6.3. サンプル OSGi サービスインターフェイス
単一のメソッド getGreeting()
を定義する以下の Java インターフェイスで定義された OSGi サービスについて考えてみましょう。
package org.fusesource.example.hello.boston; public interface HelloBoston { public String getGreeting(); }
12.6.4. サンプルサービスのエクスポート
HelloBoston
OSGi サービスを実装するバンドルを定義するとき、以下の Blueprint 設定を使用してサービスをエクスポートできます。
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="hello" class="org.fusesource.example.hello.boston.HelloBostonImpl"/>
<service ref="hello" interface="org.fusesource.example.hello.boston.HelloBoston"/>
</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}")
bean
コマンドでは、最初の引数は OSGi インターフェイスまたはクラスで、これは OSGi サービスバンドルからエクスポートされたインターフェイスと一致する必要があります。2 番目の引数は、呼び出す Bean メソッドの名前です。bean
コマンド構文の詳細は、Apache Camel Development Guide の Bean Integration を参照してください。
このアプローチを使用すると、OSGi サービスが暗黙的にインポートされます。この場合、OSGi サービスを明示的にインポートする必要はありません。
12.6.6. XML DSL からの OSGi サービスの呼び出し
XML DSL では、Bean 言語を使用して HelloBoston
OSGi サービスを呼び出すこともできますが、構文は若干異なります。XML DSL では、以下のように method
要素を使用して Bean 言語を介して OSGi サービスを呼び出します。
<beans ...>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="timer:foo?period=5000"/>
<setBody>
<method ref="org.fusesource.example.hello.boston.HelloBoston" method="getGreeting"/>
</setBody>
<log message="The message contains: ${body}"/>
</route>
</camelContext>
</beans>
このアプローチを使用すると、OSGi サービスが暗黙的にインポートされます。この場合、OSGi サービスを明示的にインポートする必要はありません。