TOPシステム開発> ネットワーク上にあるBundleも指定できる!
Equinox
先取りJava SE 7!

第4回:Bundleの連携の制御の仕組みを理解しよう!

著者:チェンジビジョン  近藤 寛喜   2007/8/22
1   2  3  次のページ
ネットワーク上にあるBundleも指定できる!

   こんにちは。チェンジビジョンの近藤です。「第3回:体験!モジュールの動的な追加と削除」では、OSGiの特徴であるモジュールの動的な追加・削除について説明しました。

   「install」コマンドを使うとモジュールの追加が行われますが、実際にモジュールがコピーされているわけではなく、メモリ上での追加しか行われていません。そのため新しいモジュールを追加することで、既存の環境において新しい機能を試すことができます。その機能が気に入らなければ、その場で「uninstall」をすることでモジュールを削除できます。

   このようにOSGiコンソールからコマンドを入力することで、Equinoxを止めずに動的にモジュールを追加、削除できます。これにより機能は機能的に十分かどうかを確認しながら進めるような、インクリメントに開発を進めたいアジャイル開発に活用できるといえるでしょう。

   前回触れられませんでしたが、「install」コマンドではネットワーク上にあるBundleを指定できます(以下は、誌面の関係上改行して掲載していますので、注意してください)。
install http://www.thinkit.co.jp/free/article/0708/9/4/
jp.co.thinkit.equinox.hello.service.rss_1.0.0.jar

   これはオフショア開発などの分散開発を容易にする可能性があります。分散開発時はファイルのやり取りを行うため、ファイルの同期がうまくいかないことがありました。実際に動作させているBundleでやり取りをすれば今まで以上に機能的な確認を行いやすいのではないでしょうか。

   さて今回はサンプルアプリケーションがどのようにサービスを追加していたのか、ソースコードを基に解説していきます。


サンプルアプリケーションの制御はどのように行われているのか

   サンプルアプリケーションでは新しいBundleをインストールし、活性化させるだけで新しいサービスをティッカー表示に追加していました。このティッカーの制御はどうやって行われているのでしょうか。


Bundleの開始・停止を制御するBundleActivator

   ティッカーに新しいサービスを追加するにはBundleをインストール(install)するだけではなく、Bundleを起動(start)させる必要がありました。Bundleを起動するとBundleの状態が「ACTIVE」、つまり活性化されます。勘の良い方はこのことからBundleを活性化する時に処理がフックされていることが予想できるのではないでしょうか。

   実はその通りで、サービスの追加はBundleを起動する時に行われています。まず「jp.co.thinkit.equinox.hello.service」プロジェクトにある「META-INF/MANIFEST.MF」を開いてください(リスト1)。

リスト1:jp.co.thinkit.equinox.hello.serviceのMANIFEST.MF
(省略)
Bundle-SymbolicName: jp.co.thinkit.equinox.hello.service
Bundle-Version: 1.0.0
Bundle-Activator: jp.co.thinkit.equinox.hello.service.ServiceActivator
Bundle-Vendor: ThinkIT
Eclipse-LazyStart: true
Import-Package: org.osgi.framework;version="1.3.0",
org.osgi.util.tracker;version="1.3.1"
Export-Package: jp.co.thinkit.equinox.hello.service
Require-Bundle: jp.co.thinkit.equinox.hello.ui
Bundle-ClassPath: bin/

   第1回で簡単に触れましたが、OSGiではBundleのモジュールとしての定義をMANIFEST.MFに行います。Bundleの起動・停止時に処理を行う場合の制御クラスの指定もMANIFEST.MFにて行います。

   Bundle-Activatorというキー名で指定されているクラスがBundleの起動時、停止時の制御を行っているのです。リスト1では「jp.co.thinkit.equinox.hello.service.ServiceActivator」クラスが指定されています。

   続いてServiceActivatorクラスを見てみましょう(リスト2)。

リスト2:jp.co.thinkit.equinox.hello.service.ServiceActivatorクラス
jp.co.thinkit.equinox.hello.service.ServiceActivatorクラス
(画像をクリックすると別ウィンドウに拡大図を表示します)

   リスト1のBundle-Activatorでは、「org.osgi.framework.BundleActivator」インターフェースを実装したクラスを指定します。BundleActivatorインターフェースは、Bundleの起動、停止をフックできます。

   OSGiコンソール上でstartコマンドを実行すると起動時の処理をフックするクラスServiceActivatorのstartメソッド(リスト2-1)が呼び出され、コンソールに「Hello OSGi Service」が出力されます。同じようにstopコマンドでは、stopメソッド(リスト2-3)が呼び出され、コンソールに「Goodbye OSGi Service」と出力されます。

1   2  3  次のページ


株式会社チェンジビジョン 近藤 寛喜
著者プロフィール
株式会社チェンジビジョン  近藤 寛喜
モデリングツールJUDEを開発しているチェンジビジョンにて、プロジェクトの現在を見える化し、状況を共有することで現場で起きている問題を解決するためのツールTRICHORDを開発している。以前からオープンソースのプロジェクトに興味を持ち、特にEclipseプラットフォームに心酔している。最近はゲームの操作感を刷新したWiiリモコンを使って何か面白いUIが作れないか模索している。


INDEX
第4回:Bundleの連携の制御の仕組みを理解しよう!
ネットワーク上にあるBundleも指定できる!
  サービスの登録・削除を行うBundleContextとServiceRegistration
  サービスを利用するためにBundleContextに登録されているサービスの追跡を行うServiceTracker