1.4. OSGi サービス
1.4.1. 概要
OSGi サービスは、名前/値のペアとして定義されたサービスプロパティーを持つ Java クラスまたはサービスインターフェイスです。サービスのプロパティーは、同じサービスインターフェイスでサービスを提供するサービスプロバイダーを区別します。
OSGi サービスは、サービスインターフェイスで意味的に定義され、サービスオブジェクトとして実装されます。サービスの機能は、実装するインターフェイスで定義されます。そのため、異なるアプリケーションが同じサービスを実装できます。
サービスインターフェイスは、バンドルが実装ではなく、インターフェイスをバインドして対話できるようにします。サービスインターフェイスは、できるだけいくつかの実装詳細で指定する必要があります。
1.4.2. OSGi サービスレジストリー
OSGi フレームワークでは、サービスレイヤーがパブリッシュ、検索、バインドサービスモデルを使用して 「OSGi バンドル」 と含まれるコンポーネント間の通信を提供します。サービスレイヤーには、以下が含まれるサービスレジストリーが含まれます。
- サービスプロバイダーは、他のバンドルで使用されるフレームワークにサービスを登録します。
- サービス要求側がサービスを見つけ、サービスプロバイダーにバインドします。
サービスはバンドルによって所有され、そこから実行されます。バンドルは、サービスの実装を 1 つ以上の Java インターフェイスにあるフレームワークサービスレジストリーに登録します。そのため、サービスの機能はフレームワークの制御下にある他のバンドルで利用でき、他のバンドルはサービスを検索し、使用できます。ルックアップは、Java インターフェイスとサービスプロパティーを使用して実行されます。
各バンドルは、そのインターフェイスとプロパティーの完全修飾名を使用して、サービスレジストリーに複数のサービスを登録できます。バンドルは、LDAP 構文の名前とプロパティーを使用して、サービスレジストリーにサービスを照会します。
バンドルは、公開、検出、バインドなどのランタイムサービスの依存関係管理アクティビティーを担当します。バンドルは、バンドルにバインドされているサービスの動的な可用性 (到着または出発) に起因する変更にも適応できます。
イベント通知
サービスインターフェイスは、バンドルで作成したオブジェクトにより実装されます。バンドルには次のことができます。
- サービスを登録する
- サービスを検索する
- 登録状態が変化したときに通知を受け取る
OSGi フレームワークは、イベント通知メカニズムを提供するため、サービスレジストリーに変更が発生したときに、サービスリクエスターは通知イベントを受信できます。これらの変更には、特定のサービスの公開または取得、およびサービスが登録、変更、または登録解除された場合などが含まれます。
サービス呼び出しモデル
バンドルがサービスを使用する場合に、バンドルはサービスを検索し、通常の Java 呼び出しとして Java オブジェクトを呼び出します。したがって、サービスの呼び出しは同期しており、同じスレッドで発生します。より非同期的な処理にコールバックを使用できます。パラメーターは、Java オブジェクト参照として渡されます。XML の場合のように、マーシャリングや中間の正規形式は必要ありません。OSGi は、サービスが利用できないという問題を解決します。
OSGi フレームワークサービス
独自のサービスに加えて、OSGi フレームワークは、フレームワークの操作を管理するために以下のオプションのサービスを提供します。
パッケージ管理サービス: 管理エージェントが共有パッケージのステータスを調べることで、Java パッケージ共有の管理ポリシーを定義できるようにします。また、管理エージェントがパッケージを更新し、必要に応じてバンドルを停止して再起動できるようにします。このサービスにより、管理エージェントは、エクスポートするバンドルがアンインストールされるか、更新されたときに、共有パッケージに関する決定を行うことができます。
このサービスは、最後の更新以降に削除または更新されたエクスポート済みパッケージを更新して、特定のバンドルを明示的に解決するメソッドも提供します。このサービスは、実行時にバンドル間の依存関係を追跡することもできるため、アップグレードによって影響を受ける可能性のあるバンドルを確認できます。
- 開始レベルサービス: 管理エージェントがバンドルの開始順序と停止順序を制御できるようにします。サービスは、各バンドルに開始レベルを割り当てます。管理エージェントは、バンドルの開始レベルを変更し、フレームワークのアクティブな開始レベルを設定できるので、適切にバンドルの開始および停止が行われます。このアクティブな開始レベル以下のバンドルだけを有効にできます。
- URL ハンドラーサービス: URL スキームとコンテンツハンドラーを使用して Java ランタイムを動的に拡張し、任意のコンポーネントで URL ハンドラーを追加できるようにします。
- パーミッション管理サービス: OSGi フレームワーク管理エージェントが特定のバンドルのパーミッションを管理し、すべてのバンドルにデフォルトを提供できるようにします。バンドルには、パーミッションセットを 1 つ含めることができ、これを使用して特権コードを実行する権限があるかを検証します。ポリシーをその場で変更したり、新しくインストールしたコンポーネントに新しいポリシーを追加したりすることで、アクセス許可を動的に操作できます。ポリシーファイルは、バンドルで実行できる内容の制御に使用されます。
- 条件付きアクセス許可管理サービス: パーミッションの確認時に特定の条件が true または false の場合に適用できるパーミッションを使用して、アクセス許可管理サービスを拡張します。これらの条件をもとに、パーミッションの適用先のバンドルの選択肢が決まります。パーミッションは、設定後すぐに有効になります。
OSGi フレームワークサービスについては、OSGi Alliance Web サイトの リリース 4 ダウンロードページ から入手できる OSGi Service Platform リリース 4 仕様の個別の章で詳しく説明されています。
OSGi Compendium サービス
OSGi フレームワークサービスに加えて、OSGi Alliance は、標準化された Compendium サービスのセット (任意) を定義します。OSGi Compendium サービスは、ロギングや設定などのタスクの API を提供します。これらのサービスについては、OSGi Alliance Web サイトの release 4 download page から入手できる OSGi Service Platform, Service Compendium に記載されています。
Configuration Admin Compendium サービスは、設定情報を保持し、それを関係者に配布する中央ハブのようなものです。設定管理サービスは、デプロイされたバンドルの設定情報を指定し、バンドルが有効な場合にそのデータを確実に受信するようにします。バンドルの設定データは、名前と値のペアのリストです。「Apache Karaf のアーキテクチャー」を参照してください。