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

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

近藤 寛喜

2007年8月22日 20:00

ネットワーク上にある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」と出力されます。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30