サービスの登録・削除を行うBundleContextとServiceRegistration
サービスの登録・削除を行うBundleContextとServiceRegistration
ServiceActivator#startメソッドとServiceActivator#stopメソッドでは、 「org.osgi.framework.BundleContext」のインスタンスに対してサービスの追加・削除を行っています。 「org.osgi.framework.BundleContext」インターフェースはOSGiフレームワーク全体で共有するサービスの制御や、 Bundleの情報を取得するためのメソッドを規定したものです。BundleからOSGiフレームワーク全体の情報へアクセスするときは、このインター フェースを介してアクセスします。
BundleContext#registerServiceメソッドでBundleContextにサービスを追加しています。BundleContextの主要なメソッドを表1に示します。
| メソッド名 | 役割 |
|---|---|
| registerService (String,Object,Dictionary) |
BundleContextにサービスを登録します。 Dictionaryにはサービスのプロパティを登録します。サービスのプロパティには優先度などが登録できます。指定できるプロパティは 「org.osgi.framework.Constants」クラスに まとめられています。 |
| getBundles() | OSGiフレームワークにインストールされているすべてのBundleを取得します。他のBundleを参照するためにはBundleの名前の方が扱いやすいので、他のBundleを参照したい場合は主に使用するのはこちらでしょう。 |
| getBundle(long) | OSGiフレームワークにインストールされているBundleを取得します。残念ながらAPIにはBundleのIDを指定するものしか用意されていません。 |
| getBundle() | このBundleContextを参照しているBundleクラスを返却します。BundleContextはBundleクラスごとに用意されます。 |
サービスの削除には「org.osgi.framework.ServiceRegistration」インターフェースを利用します。また、 ServiceRegistrationインターフェースはサービスのプロパティ情報の登録を行うなどサービスの登録情報を操作するインターフェースを規定しています。
リスト2-2で登録しているのは「jp.co.thinkit.equinox.hello.ui.INotificationService」イ ンターフェースを実装した 「jp.co.thinkit.equinox.hello.service.HelloNotificationService」クラスです。この INotificationServiceインターフェースはOSGiのインターフェースではなく、筆者が規定したインターフェースです。
このINotificationServiceインターフェースは「jp.co.thinkit.equinox.hello.ui」プロジェクトで定義しています(リスト3)。
リスト3:jp.co.thinkit.equinox.hello.ui.INotificationServiceインターフェース
(省略)
public interface INotificationService {
public List getContents();
}
INotificationMessageインターフェースはティッカーへ表示するコンテンツを保持するモデルを定義したものです。このインター フェースも「jp.co.thinkit.equinox.hello.ui」プロジェクトで定義されています。ティッカー表示に新しい通知を組み入れる場合はINotificationServiceインターフェースを実装し、BundleContextのインスタンスへ登録します。
このようにBundleContextのインスタンスへ登録するサービスはアプリケーションの開発者が作成できます。
OSGiフレームワークへ登録できるサービスには、ただのJava Objectを登録することもできます。サービスを登録するときに、そのサービスのインターフェースを明らかにしておくため、インターフェースの名前を基に登録してください。