GlassFish v3 の OSGi 対応について

2009年12月21日 at 10:20 PM

今日は、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:
============================
-> ps (GlassFish v3 で導入されているバンドル一覧)
START LEVEL 1
ID State Level Name
[ 0] [Active ] [ 0] System Bundle (2.0.2)
[ 1] [Active ] [ 1] HK2 OSGi Main Bundle (1.0.0)
[ 2] [Installed ] [ 1] AMX V3 extensions implementation (3.0.0.b74b)
[ 3] [Resolved ] [ 1] org.glassfish.core.glassfish-extra-jre-packages
[ 4] [Installed ] [ 1] Branding Fragment (3.0.0.b74b)
[ 5] [Active ] [ 1] Private APIs of Glassfish V3 (3.0.0.b74b)
[ 6] [Resolved ] [ 1] Inversion of Control / Autodependency mechanism (1.0.0)
….. (中略)
[ 243] [Resolved ] [ 1] ejb-mapping module for cmp (3.0.0.b74b)
[ 244] [Resolved ] [ 1] metro (0)
[ 245] [Installed ] [ 1] MyBundle (1.0.0)
-> start 245
-> stop 245
-> start 245
-> exit
Good Bye!

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.
enterprise.v3.services.impl|_ThreadID=24;_ThreadName=Thread-1;|Started the OSGi Bundle|#]
[#|2009-12-22T14:51:15.594+0900|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.
enterprise.v3.services.impl|_ThreadID=24;_ThreadName=Thread-1;|Stopped the OSGi Bundle|#]
[#|2009-12-22T14:51:21.882+0900|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.
enterprise.v3.services.impl|_ThreadID=24;_ThreadName=Thread-1;|Started the OSGi Bundle|#]

このように、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.
コマンド deploy は正常に実行されました。

Felix Remote Shell Console:
============================
-> ps
START LEVEL 1
ID State Level Name
[ 0] [Active ] [ 0] System Bundle (2.0.2)
[ 1] [Active ] [ 1] HK2 OSGi Main Bundle (1.0.0)
[ 2] [Active ] [ 1] AMX V3 extensions implementation (3.0.0.b74b)
[ 3] [Resolved ] [ 1] org.glassfish.core.glassfish-extra-jre-packages
[ 4] [Installed ] [ 1] Branding Fragment (3.0.0.b74b)
(….中略)
[ 244] [Resolved ] [ 1] metro (0)
[ 246] [Active ] [ 1] MyBundle (1.0.0)

広告

Entry filed under: Application Server/GlassFish. Tags: , .

SIP コンテナの設定項目一覧 GlassFishのロードバランサプラグインで Apache と連携 Part1(Apache 設定編)


Java Champion & Evangelist

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2009年12月
« 11月   1月 »
 123456
78910111213
14151617181920
21222324252627
28293031  

カテゴリー

Twitter

clustermap

ブログ統計情報

  • 1,019,573 hits

Feeds


%d人のブロガーが「いいね」をつけました。