Archive for 2009年12月21日

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:
============================
-> 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)

2009年12月21日 at 10:20 午後

SIP コンテナの設定項目一覧

SailFin (Sun GlassFish Communications Server) の設定項目について調べ、
この情報は SailFin をご利用の方には有用な情報になるかと思い、本ブログでも
公開します。

下記は、SailFin の中で特に SIP コンテナに関連した設定項目の一覧になります。
もちろん、下記の設定項目以外に GlassFish で提供される設定項目も設定変更が
可能ですが、ここでは特に SIP コンテナ、SIP リスナーに関する項目だけを抜粋しています。
また、下記の設定項目は GUI の管理コンソールからも設定変更ができますので
必要に応じて、GUI 管理コンソールをご使用ください。

パラメータ名 意味 デフォルト値
server.log-service.module-log-levels.property.sip 各サーバーモジュールのログレベルを指定
します。

FINEST: 最大の詳細度

FINER: 中間の詳細度

FINE: 最小の詳細度

CONFIG: サーバー設定に関連するメッセージ

INFO: サーバー設定、またはエラーを除くサーバーの状態に関連するメッセージ

WARNING: 例外を含む警告

SEVERE: 正常なプログラム実行の妨げになるイベント

INFO
server.monitoring-service.module-monitoring-levels.property.sip-service SIP サービスの監視を有効
「LOW」または「HIGH」を選択します
OFF
server.sip-container.external-address コールバッククライアントがレスポンスを
返信する際に使用する外部からアクセス可能な
アドレスを指定します。
N/A
server.sip-container.external-sip-port コールバッククライアントがレスポンスを
返信する際に使用する外部からアクセス可能な
SIP用のポート番号を指定します。
5060
server.sip-container.external-sips-port コールバッククライアントがレスポンスを
返信する際に使用する外部からアクセス可能な
SIPS用のポート番号を指定します。
5061
server.sip-container.session-config.session-manager.manager-properties.max-sessions 最大セッション数 N/A
server.sip-container.session-config.session-manager.manager-properties.reap-interval-in-seconds 取得間隔
アクティブでないセッションデータが削除
されるまでの秒数
N/A
server.sip-container.session-config.session-manager.manager-properties.session-file-name セッションファイル名:
セッションデータを含むファイル。
N/A
server.sip-container.session-config.session-manager.manager-properties.session-id-generator-classname セッション ID ジェネレータクラス名:
セッション ID を生成するためのカスタムクラス
N/A
server.sip-container.session-config.session-manager.store-properties.directory = セッション情報をファイルに保存する際
ファイルの保存先のディレクトリを指定
(テスト環境においてのみ利用可能、
テスト時セッション情報の内容を確認する
ために利用)
N/A
server.sip-container.session-config.session-manager.store-properties.reap-interval-in-seconds 取得間隔:
アクティブでないセッションデータが削除
されるまでの秒数
N/A
server.sip-container.session-config.session-properties.timeout-in-seconds セッションタイムアウトの時間(秒) N/A
server.sip-service.property.accesslog アクセスログの保存先 ${com.sun.aas.instanceRoot}
/logs/sipaccess
server.sip-service.access-log.format SIPサービスのアクセスログのフォーマット
を指定
SIP ヘッダーの client.name、auth-user-name、
datetime、request、status、response.length、
max.forwards、from、cseq、contact、to、
content.type、via、call.id を指定可能
%client.name%
%auth-user-name%
%datetime%
%request%
%status%
%response.length%
server.sip-service.access-log.rotation-enabled アクセスログのローテーションを有効 TRUE
server.sip-service.access-log.rotation-interval-in-minutes ローテーション間隔を指定 15
server.sip-service.access-log.rotation-policy ローテーションのポリシーを指定
デフォルトの time 以外選択肢は無い
time
server.sip-service.access-log.rotation-suffix ローテーションサフィックス:
ローテーション後にアクセスログファイル名に
追加されるファイル名のサフィックス
yyyy-MM-dd
server.sip-service.connection-pool.max-pending-count 最大保留カウント:
LISTENソケットの保留の最大数
4096
server.sip-service.connection-pool.queue-size-in-bytes キューサイズ:
接続キューのバイト単位のサイズ.
-1 は、プロパティーが無効
-1
server.sip-service.connection-pool.receive-buffer-size-in-bytes 受信バッファーサイズ:
ソケットが使用する受信バッファのサイズ.
-1 は、プロパティーが無効
-1
server.sip-service.connection-pool.send-buffer-size-in-bytes 送信バッファーサイズ:
ソケットが使用する送信バッファのサイズ
8192
server.sip-service.keep-alive.max-connections 最大接続数:
キープアライブモードにある接続の最大数
256
server.sip-service.keep-alive.thread-count スレッド数:
システム内のキープアライブスレッドの数
1
server.sip-service.keep-alive.timeout-in-seconds タイムアウト:
接続がアイドルと見なされ、キープアライブ
状態で維持される最大時間。
-1 はタイムアウトが無効
-1
server.sip-service.request-processing.header-buffer-length-in-bytes SIP ヘッダーのバッファー長:
リクエスト処理スレッドがリクエストデータ
の読み込みに使用するヘッダーバッファのサイズ
8192
server.sip-service.request-processing.initial-thread-count 初期スレッド数:
SIP サービス開始時のリクエスト処理スレッド
の数
10
server.sip-service.request-processing.request-timeout-in-seconds リクエストタイムアウト:
SIPリクエストがタイムアウトされるまでの秒数
30
server.sip-service.request-processing.thread-count リクエストスレッド数:
リクエスト処理スレッドの最大数
10
server.sip-service.request-processing.thread-increment スレッドの増分:
リクエスト数が初期スレッド数に達した時点で
追加されるスレッド数
1
server.sip-service.sip-listener.sip-listener-*.address ネットワークアドレス:
ドットで区切られたペアまたは IPv6 形式で
指定可能。
複数のIPアドレスでリクエスト受け付けたい場合、
0.0.0.0、any (または ANY)、または
INADDR_ANY (すべて IP アドレス)を指定
0.0.0.0
server.sip-service.sip-listener.sip-listener-*.enabled SIP リスナーの有効/無効を設定 TRUE
server.sip-service.sip-listener.sip-listener-*.external-sip-address 外部向け SIPアドレス:
この値を指定した場合は、SIP コンテナの設定
よりも優先されます
N/A
server.sip-service.sip-listener.sip-listener-*.external-sip-port 外部向け SIPポート番号:
この値を指定した場合は、SIP コンテナの設定
よりも優先されます
N/A
server.sip-service.sip-listener.sip-listener-*.id SIPリスナーの識別名 sip-listener-1/
Sip-listener-2
server.sip-service.sip-listener.sip-listener-*.port SIPポート番号 5060/5061
server.sip-service.sip-listener.sip-listener-*.ssl.cert-nickname SIPS用のサーバ証明書のニックネームを設定 s1as
server.sip-service.sip-listener.sip-listener-*.ssl.client-auth-enabled SIPS用クライアント認証の有効/無効設定 FALSE
server.sip-service.sip-listener.sip-listener-*.ssl.ssl2-ciphers SIPS用 SSLv2の暗号化方式の指定 N/A
server.sip-service.sip-listener.sip-listener-*.ssl.ssl2-enabled SIPS用 SSLv2の有効/無効設定 FALSE
server.sip-service.sip-listener.sip-listener-*.ssl.ssl3-enabled SIPS用 SSLv3の有効/無効設定 FALSE
server.sip-service.sip-listener.sip-listener-*.ssl.ssl3-tls-ciphers SIPS用 SSLv3/TLSの暗号化方式の指定 N/A
server.sip-service.sip-listener.sip-listener-*.ssl.tls-enabled SIPS用 TLSの有効/無効設定 TRUE
server.sip-service.sip-listener.sip-listener-*.ssl.tls-rollback-enabled SIPS用のTLSロールバックの有効/無効設定 TRUE
server.sip-service.sip-listener.sip-listener-*.transport SIPリスナーの転送プロトコル TCP/UDP or tls
server.sip-service.sip-listener.sip-listener-*.type SIPリスナーの種類
タイプにはデフォルト、外部、または内部を
指定できます。内部リスナーは、clb により
プロキシの目的でのみ使用されます。
外部リスナーは、clb ではなく UA によってのみ
使用されます。デフォルトのタイプは両方利用
可能です。
default
server.sip-service.sip-protocol.default-tcp-transport デフォルトトランスポート:
contact および record-route ヘッダーの URI で
“transport=tcp” の挿入を有効/無効にします。
FALSE
server.sip-service.sip-protocol.error-response-enabled エラー応答:
不正な要求に対するエラー応答の送信を有効/
無効にします。
FALSE
server.sip-service.sip-protocol.sip-link.connection-alive-timeout-in-seconds 接続生存状態のタイムアウト:
接続を終了するまでに、SIP リンクがアクティブ
でない状態を許可される最大時間。
デフォルトは 120 秒。
120
server.sip-service.sip-protocol.sip-link.max-queue-length キューの最大長:
1 つのリンク上で書き込みを待機できる、
同時書き込み要求、または接続要求の最大数、
またはその両方の最大数。
デフォルトの要求数は 50
50
server.sip-service.sip-protocol.sip-link.write-timeout-in-millis 書き込みタイムアウト:
SIP リンクの 1 回の書き込み操作の最大時間
範囲は 1 から 50 ミリ秒
デフォルトは 10 ミリ秒
10
server.sip-service.sip-protocol.sip-link.write-timeout-retries 書き込みタイムアウトの再試行回数:
SIP リンクの単一の書き込み操作を再試行する
最大回数。範囲は 1 から 25
デフォルトは 25 です。
25
server.sip-service.sip-protocol.sip-timers.t1-in-millis SIP タイマー
タイマー T1:
T1 は、クライアントとサーバーの
トランザクション間の推定往復時間
デフォルト値は 500 ミリ秒
500
server.sip-service.sip-protocol.sip-timers.t2-in-millis タイマー T2:
非 INVITE 要求と INVITE 応答の最大の再送信
間隔
デフォルト値は 4000 ミリ秒
4000
server.sip-service.sip-protocol.sip-timers.t4-in-millis タイマー T4:
メッセージがネットワークに存続する最大時間
デフォルト値は 5000 ミリ秒
5000
server.overload-protection-service.enabled 過負荷保護サービス機能の有効/無効設定 FALSE
server.overload-protection-service.cpu-overload-protection CPU 過負荷保護の有効/無効設定 FALSE
server.overload-protection-service.cpu-http-threshold HTTP リクエストに対するアクセス拒否を行う
CPU の閾値を設定 (0% から 100%)
閾値を超えるとHTTP 503 エラーを返す
70
server.overload-protection-service.cpu-ir-threshold SIP 初期リクエストに対するアクセス拒否を行う
CPU の閾値を設定 (0% から 100%)
閾値を超えるとHTTP 503 エラーを返す
70
server.overload-protection-service.cpu-sr-threshold SIP 初期リクエスト以降のリクエストに対する
アクセス拒否を行うCPU の閾値を設定
(0% から 100%)
閾値を超えるとHTTP 503 エラーを返す
90
server.overload-protection-service.cpu-mm-threshold HTTP/SIP の両リクエストに対するアクセス
拒否を行うCPU の閾値を設定 (0% から 100%)
閾値を超えるとHTTP 503 エラーを返す
99
server.overload-protection-service.cpu-overload-activation-algorithm CPU 過負荷によるアクセス拒否
有効化アルゴリズムの選択:
CPU の過負荷保護を有効にするかどうかを
決定するアルゴリズムを指定します。
CONSECUTIVE もしくは MEDIAN を指定
MEDIAN
server.overload-protection-service.cpu-overload-deactivation-algorithm CPU 過負荷によるアクセス拒否
無効化アルゴリズムの選択:
CPU の過負荷保護を無効にするかどうかを
決定するアルゴリズムを指定します。
CONSECUTIVE もしくは MEDIAN を指定
CONSECUTIVE
server.overload-protection-service.mm-threshold-http-wait-time CPU 過負荷時
スレッドプールに戻されるまでにスレッドが
保持される期間を設定。
デフォルト2秒
2
server.overload-protection-service.number-of-samples CPU 過負荷の計測において
過負荷と判断されるまでに必要なサンプルの数を
設定
設定可能な最小サンプリングレートは 2
5
server.overload-protection-service.retry-after-interval CPU 過負荷を計測する間隔
503 エラーレスポンスの retry-after ヘッダに
ここで設定した値が書き加えられる
10
server.overload-protection-service.sample-rate CPU 過負荷の計測における計測間隔を設定
正の値を指定可能
2
server.overload-protection-service.memory-overload-protection メモリ過負荷保護の有効/無効設定 FALSE
server.overload-protection-service.mem-http-threshold HTTP リクエストに対するアクセス拒否を行う
メモリの閾値を設定 (0% から 100%)
閾値を超えるとHTTP 503 エラーを返す
85
server.overload-protection-service.mem-ir-threshold SIP 初期リクエストに対するアクセス拒否を行う
メモリの閾値を設定 (0% から 100%)
閾値を超えるとHTTP 503 エラーを返す
85
server.overload-protection-service.mem-sr-threshold SIP 初期リクエスト以降のリクエストに対する
アクセス拒否を行うメモリの閾値を設定
(0% から 100%)
閾値を超えるとHTTP 503 エラーを返す
85
server.overload-protection-service.mem-mm-threshold HTTP/SIP の両リクエストに対するアクセス
拒否を行うメモリの閾値を設定 (0% から 100%)
閾値を超えるとHTTP 503 エラーを返す
99
server.overload-protection-service.mem-overload-activation-algorithm メモリ過負荷によるアクセス拒否
有効化アルゴリズムの選択:
メモリの過負荷保護を有効にするかどうかを
決定するアルゴリズムを指定します。
CONSECUTIVE もしくは MEDIAN を指定
MEDIAN
server.overload-protection-service.mem-overload-deactivation-algorithm メモリ過負荷によるアクセス拒否
無効化アルゴリズムの選択:
メモリの過負荷保護を無効にするかどうかを
決定するアルゴリズムを指定します。
CONSECUTIVE もしくは MEDIAN を指定
CONSECUTIVE

2009年12月21日 at 6:33 午後


Java Champion & Evangelist

Translate

ご注意

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

カレンダー

2009年12月
 123456
78910111213
14151617181920
21222324252627
28293031  

カテゴリー

Twitter

clustermap

ブログ統計情報

  • 1,263,631 hits

RSSフィード

アーカイブ