第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
OSGI-INF/blueprint
このディレクトリー下の .xml
が付いたファイルはすべて、Blueprint 設定ファイルとして解釈されます。つまり、パターン OSGI-INF/blueprint/*.xml
に一致するファイルがこれに該当します。
Maven プロジェクトでの Blueprint ファイルの場所
Maven プロジェクト ProjectDir のコンテキストでは、Blueprint 設定ファイルの標準の場所は次のディレクトリーです。
ProjectDir/src/main/resources/OSGI-INF/blueprint
ProjectDir/src/main/resources/OSGI-INF/blueprint
Blueprint の名前空間とルート要素
Blueprint 設定要素は、次の XML 名前空間に関連付けられています。
http://www.osgi.org/xmlns/blueprint/v1.0.0
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>
<?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
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: 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 を作成する方法を示しています。
最後の Bean の例によって参照される Account
クラスは以下のように定義できます。
参考資料
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 に宣言します。
property-placeholder
設定オプションの指定は http://aries.apache.org/schemas/blueprint-ext/blueprint-ext.xsd にあります。