Menu Close
第12章 OSGi サービス
概要
OSGi コアフレームワークは、OSGi サービスレジストリーで Java オブジェクトをサービスとして登録することで、バンドルが対話する簡単なメカニズムを提供する OSGi Service Layer を定義します。OSGi サービスモデルの長所の 1 つは、任意の Java オブジェクトをサービスとして提供できることです。サービスクラスに適用する必要のある特定の制約、継承ルール、またはアノテーションはありません。本章では、OSGi Blueprint コンテナーを使用して OSGi サービスをデプロイする方法を説明します。
12.1. Blueprint コンテナー
概要
Blueprint コンテナーは、OSGi コンテナーとの対話を簡素化する依存性注入フレームワークです。Blueprint コンテナーは、OSGi サービスレジストリーを使用する設定ベースのアプローチをサポートします。たとえば、OSGi サービスをインポートおよびエクスポートするための標準の XML 要素を提供します。
12.1.1. Blueprint の設定
JAR ファイルの Blueprint ファイルの場所
バンドル JAR ファイルのルートを基準にすると、Blueprint 設定ファイルの標準の場所は次のディレクトリーです。
OSGI-INF/blueprint
このディレクトリーの接尾辞( .xml
)のファイルは、Blueprint 設定ファイルとして解釈されます。つまり、パターンに一致するファイルはすべて OSGI-INF/blueprint/*.xml
として解釈されます。
Maven プロジェクトの Blueprint ファイルの場所
Maven プロジェクト ProjectDir のコンテキストでは、Blueprint 設定ファイルの標準的な場所は次のディレクトリーです。
ProjectDir/src/main/resources/OSGI-INF/blueprint
Blueprint namespace とルート要素
Blueprint の設定要素は、以下の XML namespace に関連付けられています。
http://www.osgi.org/xmlns/blueprint/v1.0.0
Blueprint 設定のルート要素は Blueprint
であるため、通常、Blueprint XML 設定ファイルの形式は以下のようになります。
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> ... </blueprint>
Blueprint のルート
要素では、スキーマの場所が Blueprint フレームワークにすでに知られているため、xsi:schemaLocation
属性を使用して Blueprint スキーマの場所を指定する必要はありません。
Blueprint マニフェストの設定
Blueprint 設定の一部の側面は、以下のように JAR のマニフェストファイル META-INF/MANIFEST.MF
のヘッダーで制御されます。
カスタムの Blueprint ファイルの場所
Blueprint 設定ファイルを標準以外の場所(つまり、OSGI-INF/blueprint/*.xml
以外の場所)に配置する必要がある場合は、マニフェストファイルの Bundle-Blueprint
ヘッダーに、コンマ区切りの場所一覧を指定することができます。以下に例を示します。
Bundle-Blueprint: lib/account.xml, security.bp, cnf/*.xml
必須の依存関係
OSGi サービスの依存関係は、デフォルトで必須です(参照要素で availability
属性を optional
または reference
-list
要素で optional に設定)。依存関係を必須として宣言すると、バンドルはその依存関係なしで適切に機能しなくなり、依存関係が常に利用可能である必要があります。
通常、Blueprint コンテナーの初期化中、猶予期間 を経過し、その間にすべての必須の依存関係を解決しようとします。この時間内に必須の依存関係を解決できない場合 (デフォルトのタイムアウトは 5 分) 、コンテナーの初期化は中断され、バンドルは起動されません。以下の設定を Bundle-SymbolicName
マニフェストヘッダーに追加して、猶予期間を設定できます。
blueprint.graceperiod
-
true
(デフォルト)の場合、猶予期間が有効で、Blueprint コンテナーは必須の依存関係を初期化中に解決されるのを待ちます。false
の場合、猶予期間は省略され、コンテナーは必須の依存関係が解決されているかどうかを確認しません。 blueprint.timeout
- 猶予期間のタイムアウトをミリ秒単位で指定します。デフォルトは 300000 (5 分) です。
たとえば、10 秒の猶予期間を有効にするには、マニフェストファイルに以下の Bundle-SymbolicName
ヘッダーを定義できます。
Bundle-SymbolicName: org.fusesource.example.osgi-client; blueprint.graceperiod:=true; blueprint.timeout:= 10000
Bundle-SymbolicName
ヘッダーの値はセミコロン区切りリストです。1 つ目の項目は実際のバンドルシンボリック名、2 つ目の項目、Blueprint.graceperiod:=true
)で、猶予期間および 3 つ目のアイテム、Blueprint.timeout:= 10000
を 10 秒のタイムアウトを指定します。
12.1.2. サービス Bean の定義
概要
Blueprint コンテナーを使用すると、bean
要素を使用して Java クラスをインスタンス化できます。このように、メインアプリケーションオブジェクトすべてを作成できます。特に、bean
要素を使用して OSGi サービスインスタンスを表す Java オブジェクトを作成できます。
Blueprint Bean 要素
Blueprint Bean
要素は、Blueprint スキーマ名前空間 http://www.osgi.org/xmlns/blueprint/v1.0.0
で定義されます。
サンプル Bean
以下の例は、Blueprint の bean
要素を使用して異なるタイプの Bean を作成する方法を示しています。
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="label" class="java.lang.String"> <argument value="LABEL_VALUE"/> </bean> <bean id="myList" class="java.util.ArrayList"> <argument type="int" value="10"/> </bean> <bean id="account" class="org.fusesource.example.Account"> <property name="accountName" value="john.doe"/> <property name="balance" value="10000"/> </bean> </blueprint>
最後の Bean の例によって参照される Account
クラスは以下のように定義できます。
package org.fusesource.example; public class Account { private String accountName; private int balance; public Account () { } public void setAccountName(String name) { this.accountName = name; } public void setBalance(int bal) { this.balance = bal; } ... }
参考資料
Blueprint Bean の定義に関する詳細は、以下の参考資料を参照してください。
- Spring Dynamic Modules Reference Guide v2.0, Blueprint chapter.
- OSGi Compendium Services R4.2 仕様のセクション 121 Blueprint Container Specification
12.1.3. プロパティーを使用した Blueprint の設定
概要
ここでは、Camel コンテキスト外にあるファイルに保持されるプロパティーを使用して、Blueprint を設定する方法を説明します。
Blueprint Bean の設定
Blueprint Bean は、外部ファイルのプロパティーを置換できる変数を使用して設定できます。ext
名前空間を宣言し、Blueprint の xml に プロパティープレースホルダー
Bean を追加する必要があります。Property-Placeholder
Bean を使用して、プロパティーファイルの場所をブループリントに宣言します。
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0"> <ext:property-placeholder> <ext:location>file:etc/ldap.properties</ext:location> </ext:property-placeholder> ... <bean ...> <property name="myProperty" value="${myProperty}" /> </bean> </blueprint>
プロパティープレースホルダーの 設定オプションは
http://aries.apache.org/schemas/blueprint-ext/blueprint-ext.xsd にあります。