GlassFish v3 の OSGi 対応について
今日は、GlassFish v3 の OSGi 対応について説明します。
セミナー等で登壇する際、GlassFish v2.x と GlassFish v3 は GUI の
管理コンソールや CLI の管理ツールの使用方法はよくにていますが、
内部実装はまったく別物ですと説明しています。
今回、GlassFish v3 で内部実装がどのように変わったかについて説明します。
GlassFish v3 はシステムの柔軟性を高めるためまた実行時のパフォーマンスを
向上させるためにモジュールシステムを採用しました。
GlassFish v2 までは各機能を全て一つにまとめて提供していたため、
EJB が必要のないユーザも、EJB コンテナを含んだ形でインストール/起動を
しなければなりませんでした。また、ユーザが独自に管理ツールを拡張したり
アプリケーションサーバを拡張したりすることは困難でした。
しかし、GlassFish v3 からはモジュールシステムを導入したため、EJB が
必要のないユーザは EJB を起動しないだけでなく、インストールをしないといった
選択肢も選べるようになりました。また必要に応じて独自の管理機能を
実装できるようになったため、アプリケーションサーバの運用がより柔軟に
行えるようになります。
これにより、本番環境でアプリケーションサーバを運用する際、各システムで
必要な機能だけを利用可能にし、メモリ等のリソースの消費量を減らすことができ、
結果としてパフォーマンスを向上させることができるようになります。
モジュールシステムの導入にあたって、GlassFish v3 は OSGi アライアンスの
標準準拠した Apache Felix を利用しています。全ての GlassFish v3 の機能は
Apache Felix のサービスバンドルとして実装されていますので、GlassFish v3
の管理ツールが提供している管理機能以外に、Apache Felix のインタフェースを
通じて、サービスの停止、起動などもできます。
(デフォルトの OSGi ランタイムとして Apache Felix を使用していますが、
他の OSGi ランタイム上で GlassFish を動作させることもできます。
(例:KnopflerFish など)
ここでは、かんたんに OSGi バンドルを生成する方法と
GlassFish v3 への追加方法について示します。
1. OSGi バンドルを作成します。
% vi MyBundle.java
import org.osgi.framework.*; public class MyBundle implements BundleActivator { // Start the bundle public void start(BundleContext context) { System.out.println(“Started the OSGi Bundle”); } // Stop the bundle public void stop(BundleContext context) { System.out.println(“Stopped the OSGi Bundle”); } } |
2. マニフェストファイルの作成
% vi MyBundle.mf
Manifest-Version: 1.0 Bundle-Name: MyBundle Bundle-Activator: MyBundle Bundle-SymbolicName: MyBundle Bundle-Version: 1.0.0 Import-Package: org.osgi.framework |
3. GlassFish v3 のインストールディレクトリより felix.jar が存在することを確認してください。
(コンパイル時にクラスパスを設定します)
% ls /Applications/GlassFish/glassfishv3-webprofile/glassfish/osgi/felix/bin/ felix.jar |
4. ソースコードのコンパイル
上記の felix.jar をクラスパスに追加してコンパイルしてください。
% javac -classpath /Applications/GlassFish/glassfishv3-webprofile/glassfish/osgi/felix/bin/felix.jar MyBundle.java |
5. jar アーカイブの生成
% jar cfm MyBundle.jar ./MyBundle.mf ./MyBundle.class |
6. OSGi バンドルのインストール
OSGi バンドルは glassfish/modules ディレクトリにコピーします。
% cp MyBundle.jar /Applications/GlassFish/glassfishv3-webprofile/glassfish/modules/ |
7. GlassFish v3 の起動
% asadmin start-domain domain1
DAS の起動を待機しています ………………………………….. 起動したドメイン: domain1 ドメインの場所: /Applications/GlassFish/glassfishv3-webprofile/glassfish/domains/domain1 ログファイル: /Applications/GlassFish/glassfishv3-webprofile/glassfish/domains/domain1/logs/server.log ドメインの管理ポート: 4848 コマンド start-domain は正常に実行されました。 |
8. Apache Felix コンソールへアクセス
6666番ポートへアクセスするとデフォルトで Apache Felix の
コンソールが利用できるようになっています。
% telnet localhost 6666 Trying ::1… Trying 127.0.0.1… Connected to localhost. Escape character is ‘^]’. Felix Remote Shell Console: |
9. GlassFish v3 のログの確認
独自に作成したバンドルが標準出力に吐き出すログの内容を確認してみましょう。
バンドルの起動、停止を行う度に独自に作成したバンドルからログが出力されている
ことを確認できます。
$ tail -f /Applications/GlassFish/glassfishv3-webprofile/glassfish/domains/domain1/logs/server.log
[#|2009-12-22T14:50:34.366+0900|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun. |
このように、OSGi のモジュールシステムを導入した GlassFish v3 は管理機能の拡張もできリソース管理も柔軟にできる新しいアーキテクチャになっています。GlassFish v2.x からアーキテクチャは大きく変わりますが、その利点は数多くあります。OSGi 対応した GlassFish v3 をぜひ試してみてください。
備考:
OSGi バンドルは asadmin コマンドで type=osgi を指定してデプロイすることもできます。
% asadmin deploy –type osgi ./MyBundle.jar
Application deployed successfully with name MyBundle. Felix Remote Shell Console: |
Entry filed under: Application Server/GlassFish. Tags: GlassFish, OSGi.