サーバサイドにおけるOSGiの概要
Pages: 1, 2, 3

OSGiアプリケーションの実行と展開

ここで作成するアプリケーションは、4つのOSGiバンドルから構成されています。そのうち2つにはビジネスロジックのクラスまたはサービスが、1 つにはOSGi環境で発生したイベントをリスンする監視サービスが、最後のバンドルにはサービスを呼び出して結果をテキストベース形式で返すロジックが格 納されています。ここで、OSGiバンドルにはさまざまなクラスを格納できることを再度思い出してください。このバンドルには、サーバロジックとクライア ントロジックの双方、および補助的な監視機能が格納されています。サンプルのダウンロードコードも、実際に見れば一目瞭然です。さらに、データベースロ ジックやその他のサポート機能も簡単に格納できることが分かります。

OSGiバンドルの実行と展開の方法は、処理対象となる実装に応じてまったく異なります。実際の現場でどのような方法に直面するかは、OSGiバン ドルの実行/展開用の手の込んだGUIからコマンドラインユーティリティまで、あらゆる可能性が考えられます。ここではApacheのOSGi Felix実装をターゲットとしてOSGiバンドルを構築するため、以下の手順では、この実装のコマンドラインユーティリティを使用した展開プロセスの説 明になります。

Felix 1.0をワークステーションにインストールしたら、サンプルのダウンロードで作成したすべてのOSGiバンドルをbundleという名前のFelixサブ ディレクトリにコピーします。次に、Felixの最上位ディレクトリに移動して、java -jar bin/felix.jarコマンドを呼び出します。呼び出すと、「Enter profile name:」(プロファイルを入力してください)というプロンプトが表示されます。ここで入力する名前はこのサンプルでは重要ではないので、任意の名前を 入力してください。*nixステーションを使用している場合、Felixはホームディレクトリの/.felixの下にこの名前でサブディレクトリを作成 し、インストールしたOSGiバンドルを配置します。

プロファイル名を入力すると、最初にロードされたOSGiバンドルがコマンドプロンプトに表示されます。この時点までに発生したイベントが次の順序で表示されます。

[Assuming inside top level Felix directory]
[web@ws_osmosis felix-1.0.0]$ java -jar bin/felix.jar

Welcome to Felix.
=================

Enter profile name: introtutorial

DEBUG: WIRE: 1.0 -> org.osgi.service.packageadmin -> 0
DEBUG: WIRE: 1.0 -> org.osgi.service.startlevel -> 0
DEBUG: WIRE: 1.0 -> org.ungoverned.osgi.service.shell -> 1.0
DEBUG: WIRE: 1.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 1.0 -> org.apache.felix.shell -> 1.0
DEBUG: WIRE: 2.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 2.0 -> org.apache.felix.shell -> 1.0
DEBUG: WIRE: 3.0 -> org.osgi.service.obr -> 3.0
DEBUG: WIRE: 3.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 3.0 -> org.apache.felix.shell -> 1.0
->

OSGi環境をインタフェースで操作できる状態になりました。ここで、OSGiバンドルの状態(State)について説明しておきます。「Active」(アクティブ)は、バンドルが前述の クラス ローダー グラフに実際に存在することを意味します。「Installed」(インストール済み)は、バンドルが使用可能な状態になっているか、 クラス ローダー グラフに 登録する準備ができたことを意味します。「Resolved」(解決済み)は、必要な依存関係によってバンドルが動的にロードされたことを意味します。ま ずは、このStateがどうなっているかを確認します。psコマンドを入力して、インストールされたバンドルを一覧表示します。

-> ps
START LEVEL 1
   ID   State         Level  Name
[   0] [Active     ] [    0] System Bundle (1.0.0)
[   1] [Active     ] [    1] Apache Felix Shell Service (1.0.0)
[   2] [Active     ] [    1] Apache Felix Shell TUI (1.0.0)
[   3] [Active     ] [    1] Apache Felix Bundle Repository (1.0.0)

上のコード例では、Felixのコアバンドルが環境内で「アクティブ」になっていることが分かります。ここで、次のようにサンプル アプリケーション バンドルをインストールします。

[Assuming sample bundles are located in Felix bundle sub-directory]
-> install file:bundle/listener.jar
Bundle ID: 4
-> install file:bundle/carrier.jar
Bundle ID: 5
-> install file:bundle/carrier2.jar
Bundle ID: 6
-> install file:bundle/userdesk.jar
Bundle ID: 7
-> ps
START LEVEL 1
   ID   State         Level  Name
[   0] [Active     ] [    0] System Bundle (1.0.0)
[   1] [Active     ] [    1] Apache Felix Shell Service (1.0.0)
[   2] [Active     ] [    1] Apache Felix Shell TUI (1.0.0)
[   3] [Active     ] [    1] Apache Felix Bundle Repository (1.0.0)
[   4] [Installed  ] [    1] Service listener (1.0.0)
[   5] [Installed  ] [    1] International Flights (1.0.0)
[   6] [Installed  ] [    1] Domestic Flights (1.0.0)
[   7] [Installed  ] [    1] Service Tracker-based flight client (1.0.0)

この上のコード例では、バンドル表示(ps)によって4つのアプリケーションバンドルがすべて「Installed」(インストール済み)の状態に なっていることが分かります。バンドル6の「Domestic Flights」(国内便)を開始し、バンドル7を開始/呼び出してフライトを問い合わせます。

-> start 6
DEBUG: WIRE: 5.0 -> intro.carrier.service -> 5.0
DEBUG: WIRE: 5.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 6.0 -> intro.carrier.service -> 5.0
DEBUG: WIRE: 6.0 -> org.osgi.framework -> 0
-> start 7
DEBUG: WIRE: 7.0 -> intro.carrier.service -> 5.0
DEBUG: WIRE: 7.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 7.0 -> org.osgi.util.tracker -> 0
Enter a blank line to exit.
Enter flight: Seattle
Flight available to :Seattle
Enter flight: Atlanta
No flight available to :Atlanta
Enter flight:
-> ps
START LEVEL 1
   ID   State         Level  Name
[   0] [Active     ] [    0] System Bundle (1.0.0)
[   1] [Active     ] [    1] Apache Felix Shell Service (1.0.0)
[   2] [Active     ] [    1] Apache Felix Shell TUI (1.0.0)
[   3] [Active     ] [    1] Apache Felix Bundle Repository (1.0.0)
[   4] [Installed  ] [    1] Service listener (1.0.0)
[   5] [Resolved   ] [    1] International Flights (1.0.0)
[   6] [Active     ] [    1] Domestic Flights (1.0.0)
[   7] [Active     ] [    1] Service Tracker-based flight client (1.0.0)
->

この2つのバンドルを開始するのは簡単です。クライアントバンドルによって想定された作業が実行され、都市名の入力が要求されて、「 Availability」(空席あり)または「 No Availability」 (空席なし)というテキストメッセージが返されます。ここで、バンドル5の最終状態に注意してください。このバンドルを直接操作するような作業は実行して いないにもかかわらず、状態が「Resolved」(解決済み)になっています。これは、バンドル6および7がバンドル5でしか利用できない intro.carrier.serviceパッケージに依存しているためです。OSGiは、単純にアクティブなバンドルが必要とする作業を解決すること に専念するので、バンドル5の状態はバックグラウンドで「Resolved」(解決済み)に切り替えられ、依存関係が満たされたことが通知されます。必要 に応じて、ここにあるすべてのバンドルのインストール、アンインストール、開始、停止の状態を参照すれば、OSGiでのプロセスの処理状況を確認できま す。また、「help」を入力すると、利用可能なOSGiコマンドの一覧をいつでも参照できます。

このサンプルのフライトアプリケーションだけでは、ささいなことにしか思えないかもしれません。しかし、数百または数千のクラスを同時にロードした うえ必ずしもそれらを使用しないというような、大企業のもっと複雑な環境にこのサンプルの原則を適用した場合に、ロードの必要があるクラスとロードするタ イミングを判別するというOSGiのコンセプトがいかにパフォーマンスに大きな影響を与えるか、お分かりいただけると思います。

あいまいな見通し:OSGi、Javaモジュール、JSR、およびJava EE

謝辞:OSGi、JSR、およびJava EEの今後の見通しに関するオンラインディスカッションにご参加いただいた、InfoQ、Peter Kriens、Alex Blewitt、およびEric Newcomerの各氏に感謝いたします。

OSGiが提供する機能は、動的なJavaローディングなどJavaプラットフォームに欠けている他のサービスを補完する役割を果たすので便利です が、このことは、Javaの規格団体やJSR委員会をサポートするスタッフが自分たちでよく言うように「居眠り運転」をしていたということではありませ ん。実際、OSGi/Javaの統合に関連する JSR-291、OSGiと同様のスタンドアロンJavaモジュールスペックである JSR-277、Java EE 6の今後のバージョンを参照する包括的な JSR-316など、さまざまな形でOSGiの機能に積極的に関わっています。

タイトルにある「あいまいな見通し」とは、これらのJSRイニシアチブの相互認知の度合いから取りました。開発の成熟度から言えば、OSGi関連技 術のJSR-291の方がJavaモジュール関連技術のJSR-277よりもはるかに先行しています(後者はJava SE 7の一部として策定)。しかし、OSGi関連の機能をいったん置き、実装前のJavaモジュールスペックのJSR-277(Java SE 7で実装予定)と同じフロントでの決定をちょっと先延ばしにして、将来を見据えて企業向けに特化されたJava EE 6スペックのJSR-316に目を向けると、重要な認知部分が鮮明になります。

もちろん、このあいまいな見通しはJava EE 6に関連するものであり、Java モジュールシステムのJSR 277エキスパートグループは、JSR 291/OSGiの相互運用を目指すことをすでに明言しています。総合的に見て、OSGiは3つのイニシアチブの中で最も先行しています。これは一部に は、他のJavaフロントで影響力や採用実績があるためです。したがって、最後に残る疑問は、「Java EE 6やJavaモジュールシステムはまだ設計段階なのか、それともOSGiによる補完やOSGiとの統合を目指しているのか」という点だけです。

サンプルコード

インストールするには、ダウンロードしたファイルを解凍し、Java AntおよびApache Felix OSGiがワークステーションにインストールされていることを確認します。最上位のルートディレクトリで、ant allを実行してすべてのサンプルOSGiバンドルを構築します。バンドルはどれもbundlesディレクトリに作成されます。次に、4つのサンプル OSGiバンドルをApache Felixのbundleディレクトリに(Felixに付属のjarファイルとともに)すべてコピーし、Apache Felixの最上位のディレクトリに戻ってjava -jar bin/felixを実行して、OSGiコマンドラインセッションを開始します。プロンプトが表示されたら任意のプロファイル名を入力します。プロファイ ルを入力すると、アクティブなFelix OSGiセッションに入ります。このセッションで、この記事に記載されたコマンドを実行してバンドルをインストールまたはアンインストールすることができ ます。または「help」と入力すると利用可能な操作を一覧表示できます。

まとめ

OSGiアライアンスが設立されてから数年が経過しましたが、動的なJavaローディングを構成するための詳細なピースが必要とされる一連の分野 や、通常のJavaプラットフォームではカバーされない他のフロントに影響を与えています。現在では、企業でのサービス指向アーキテクチャに注目が集まる につれ、サーバサイドのJava開発でも同様の融通の利く俊敏なフレームワーク/環境による堅牢なアプリケーション機能が求められています。

OSGiバンドルの構成および作成の方法を学び、同時にOSGiバンドルをアプリケーション内で展開および実行する手順を総合的に把握していれば、 OSGiをサーバサイドアーキテクチャで使用するメリットとその制約を理解できるとともに、OSGiがJavaプラットフォーム全体に与えてきた影響と今 後与えることになる影響について認識できるようになります。

参考資料

  • OSGi - OSGi Alliance ホームページ
  • Apache Felix - Apache Software Foundationが作成したOSGi実装

Daniel Rubio氏は、企業向けのソフトウェア開発分野で10年以上の経験を持つソフトウェアコンサルタントです。最近、新規事業としてMashup向けのWebサービスを専門とするMashup Softを創設しました。