第12章 OSGi サービス
概要
OSGi コアフレームワークは OSGi サービスレイヤー を定義します。これは、Java オブジェクトを OSGi サービスレジストリー にサービスとして登録して、バンドルによる単純な対話メカニズムを提供します。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 の名前空間とルート要素
Blueprint 設定要素は、次の XML 名前空間に関連付けられています。
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 ファイルの場所
標準以外の場所 (つまり OSGI-INF/blueprint/*.xml
以外の場所) に Blueprint 設定ファイルを配置する必要がある場合は、マニフェストファイル内の Bundle-Blueprint
ヘッダーの代替場所をコンマ区切りリストで指定できます。以下に例を示します。
Bundle-Blueprint: lib/account.xml, security.bp, cnf/*.xml
必須の依存関係
OSGi サービスの依存関係はデフォルトで必須です (ただし、reference
要素または reference-list
要素の availability
属性を 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
ヘッダーの値はセミコロン区切りのリストです。最初の項目は実際のバンドルシンボリック名で、2 番目の項目 blueprint.graceperiod:=true
は猶予期間を有効にし、3 番目のアイテム blueprint.timeout:= 10000
は 10 秒のタイムアウトを指定します。
12.1.2. サービス Bean の定義
概要
Blueprint コンテナーを使用すると、bean
要素を使用して Java クラスをインスタンス化できます。この方法で、すべてのメインアプリケーションオブジェクトを作成できます。特に、bean
要素を使用して、OSGi サービスインスタンスを表す Java オブジェクトを作成できます。
Blueprint Bean 要素
Blueprint bean
要素は、Blueprint スキーマ namespace 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 リファレンスガイド v2.0、Blueprint の章。
- OSGi CompendiumServicesR4.2 仕様のセクション 121 Blueprint コンテナー 仕様。
12.1.3. プロパティーを使用した Blueprint の設定
概要
このセクションでは、Camel コンテキスト外のファイルに保持されているプロパティーを使用して Blueprint を設定する方法について説明します。
Blueprint Bean の設定
Blueprint Bean は、外部ファイルのプロパティーを置換できる変数を使用して設定できます。ext
namespace を宣言し、Blueprint xml に property placeholder
Bean を追加する必要があります。Property-Placeholder
Bean を使用して、プロパティーファイルの場所を Blueprint に宣言します。
<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>
property-placeholder
設定オプションの指定は http://aries.apache.org/schemas/blueprint-ext/blueprint-ext.xsd にあります。