Sun ONE Application Server 7 開発者ガイド |
ライフサイクルリスナーの開発ライフサイクルリスナーモジュールは、単体または RMI サーバーのインスタンス化など、アプリケーションサーバー環境内で短時間 (または長時間) の Java ベースタスクを実行するための手段を提供します。これらのモジュールは、サーバーの起動時に自動的に起動され、サーバーのライフサイクルの各種段階で通知を受け取ります。
次の各節では、ライフサイクルモジュールを作成および使用する方法について説明します。
- サーバーライフサイクルのイベント
- LifecycleListener インタフェース
- LifecycleEvent クラス
- サーバーライフサイクルイベントコンテキスト
- ライフサイクルモジュールのアセンブルと配備
- ライフサイクルモジュールに関する注意事項
サーバーライフサイクルのイベント
ライフサイクルモジュールは、サーバーライフサイクル内の次のイベントに応じて、タスクを待機し、実行します。
- INIT_EVENT では、サーバーは設定の読み込み、組み込みサブシステム (セキュリティおよびログサービスなど) の初期化、およびコンテナの作成を行う
- STARTUP_EVENT では、サーバーは配備アプリケーションのロードと初期化を行う
- READY_EVENT では、サーバーは要求を処理する準備ができた状態で待機している
- SHUTDOWN_EVENT では、サーバーはロードしたアプリケーションを破棄して停止する
- TERMINATION_EVENT では、サーバーはコンテナ、組み込みサブシステム、サーバーの実行時環境を終了する
これらのイベントは、LifecycleEvent クラスに定義されています。
これらのイベントからの通知を受け取るライフサイクルモジュールは、LifecycleListener インタフェースを実装し、server.xml ファイルに設定されます。
LifecycleListener インタフェース
ライフサイクルモジュールを作成するということは、com.sun.appserv.server.LifecycleListener インタフェースを実装するようカスタマイズしたクラスを設定するということです。複数のライフサイクルモジュールを作成し、同時に実行できます。
LifecycleListener インタフェースは、次のメソッドを定義します。
- public void handleEvent(com.sun.appserv.server.LifecycleEvent event) throws ServerLifecycleException
このメソッドは、ライフサイクルイベントに応答し、エラーが発生した場合に com.sun.appserv.server.ServerLifecycleException をスローします。
LifecycleListener インタフェースの実装サンプルは、次の LifecycleListenerImpl.java ファイルです。ライフサイクルイベントのテストには、このファイルを利用できます。
package com.sun.appserv.server;
import java.util.Properties;
/**
* LifecycleListenerImpl は、LifecycleListener インタフェースのダミー実装です。
* この実装は、さまざまなライフサイクルインタフェースメソッドを取り除きます。
*/public class LifecycleListenerImpl implements LifecycleListener {
/** receive a server lifecycle event
* @param event associated event
* @throws <code>ServerLifecycleException</code> for exceptional condition.
*
* Configure this module as a lifecycle-module in server.xml:
*
* <applications>
* <lifecycle-module name="test"
* class-name="com.sun.appserv.server.LifecycleListenerImpl"
* is-failure-fatal="false">
* <property name="foo" value="fooval"/>
* </lifecycle-module>
* </applications>
*
* Set<code>is-failure-fatal</code>in server.xml to <code>true</code> for
* fatal conditions.
*/
public void handleEvent(LifecycleEvent event) throws ServerLifecycleException
{
LifecycleEventContext context = event.getLifecycleEventContext();
context.log("got event" + event.getEventType() + " event data: "
+ event.getData());
Properties props;
if (LifecycleEvent.INIT_EVENT == event.getEventType()) {
context.log("LifecycleListener:INIT_EVENT");
props = (Properties) event.getData();
// handle INIT_EVENT
return;
}
if (LifecycleEvent.STARTUP_EVENT == event.getEventType()) {
context.log("LifecycleListener:STARTUP_EVENT");
// handle STARTUP_EVENT
return;
}
if (LifecycleEvent.READY_EVENT == event.getEventType()) {
context.log("LifecycleListener:READY_EVENT");
// handle READY_EVENT
return;
}
if (LifecycleEvent.SHUTDOWN_EVENT== event.getEventType()) {
context.log("LifecycleListener:SHUTDOWN_EVENT");
// handle SHUTDOWN_EVENT
return;
}
if (LifecycleEvent.TERMINATION_EVENT == event.getEventType()) {
context.log("LifecycleListener:TERMINATE_EVENT");
// handle TERMINATION_EVENT
return;
}
}
}LifecycleEvent クラス
サーバーライフサイクルのイベントは、com.sun.appserv.server.LifecycleEvent クラスに定義されます。イベントには次のメソッドが関連付けられています。
- public java.lang.Object getData()
このメソッドは、イベントに関連付けられたデータを返す
- public int getEventType()
このメソッドは、INIT_EVENT、STARTUP_EVENT、READY_EVENT、SHUTDOWN_EVENT、または TERMINATION_EVENT のいずれかのイベント型を返す
- public com.sun.appserv.server.LifecycleEventContext getLifecycleEventContext()
このメソッドは、次に説明するライフサイクルイベントコンテキストを返す
LifecycleEvent インスタンスは、LifecycleListener.handleEvent メソッドに渡されます。
サーバーライフサイクルイベントコンテキスト
com.sun.appserv.server.LifecycleEventContext インタフェースは、サーバーに関する実行時の情報を表示します。ライフサイクルイベントコンテキストは、サーバーの初期化時に LifecycleEvent クラスがインスタンス化されるときに作成されます。LifecycleEventContext インタフェースは、次のメソッドを定義します。
- public java.lang.String[] getCmdLineArgs()
このメソッドは、サーバー起動時のコマンド行引数を返す
- public java.lang.String getInstallRoot()
このメソッドは、サーバーのインストールルートディレクトリを返す
- public java.lang.String getInstanceName()
このメソッドは、サーバーのインスタンス名を返す
- public javax.naming.InitialContext getInitialContext()
このメソッドは、初期 JNDI 命名コンテキストを返す。ライフサイクルモジュールの命名環境は、STARTUP_EVENT の間にインストールされる。ライフサイクルモジュールは、STARTUP_EVENT が完了した後、jndi-name 属性を使って server.xml ファイルに定義されたリソースを検索できる
注 JNDI で他の企業リソースと名前が重複することを避けるため、また、移植性の問題を回避するために、Sun ONE Application Server ライフサイクルモジュールのすべての名前は、java:comp/env という文字列から始める必要があります。
ライフサイクルモジュールが Beans を検索する必要がある場合は、READY_EVENT 内で実行できる。また、getInitialContext() メソッドを使って、すべてのリソースが結合した初期コンテキストを取得することができる
- public void log(java.lang.String message)
このメソッドは、サーバーログファイルに、指定されたメッセージを書き込む。message パラメータは、ログファイルに書き込むテキストを示す文字列である
- public void log(java.lang.String message, java.lang.Throwable throwable)
このメソッドは、サーバーログファイルに、Throwable 例外の説明的なメッセージおよびスタックトレースを書き込む。message パラメータは、エラーまたは例外を説明する文字列である。throwable パラメータは、Throwable エラーまたは例外を示す
ライフサイクルモジュールのアセンブルと配備
「ライフサイクルモジュールのアセンブル」で説明されているとおりに、ライフサイクルモジュールをアセンブルします。また、「ライフサイクルモジュールの配備」で説明されているとおりに、ライフサイクルモジュールを配備します。
ライフサイクルモジュールを配備時に、server.xml ファイル内に lifecycle-module 要素が作成されます。このファイルを編集して、設定を変更できます。property サブ要素を使って、入力パラメータを指定できます。次に例を示します。
<lifecycle-module name="customStartup"
enabled="true"
class-name="com.acme.CustomStartup"
classpath="/apps/customStartup"
load-order="200"
is-failure-fatal="true">
<description>custom startup module to do my tasks</description>
<property name="rmiServer" value="acme1:7070" />
<property name="timeout" value="30" />
</lifecycle-module>is-failure-fatal が true (デフォルトでは、false) に設定されている場合、ライフサイクルモジュールにエラーが発生すると、サーバーの初期化または起動は行われません。ただし、シャットダウンまたは強制終了は行われます。
server.xml ファイルの詳細は、『Sun ONE Application Server 管理者用設定ファイルリファレンス』を参照してください。
ライフサイクルモジュールを配備したら、サーバーを再起動してモジュールを有効にする必要があります。サーバーは設定をインスタンス化し、それをサーバー初期化時にライフサイクルイベントリスナーとして登録します。
ライフサイクルモジュールに関する注意事項
初期化中または起動中に割り当てられたリソースは、シャットダウン中または終了中に解放される必要があります。ライフサイクルモジュールのクラスは、メインサーバーのスレッドから同時に呼び出されるため、これらのクラスがサーバーをブロックしないようにすることが重要です。ライフサイクルモジュールは、必要に応じてスレッドを作成することがありますが、これらのスレッドはシャットダウンおよび終了時に停止される必要があります。
ライフサイクルモジュールクラスローダは、ライフサイクルモジュールの親クラスローダです。server.xml 内の各ライフサイクルモジュールの classpath は、クラスローダーの構築に使用されます。ライフサイクルモジュールが必要とするすべてのサポートクラスは、LifeCycleModule クラスローダーまたはその親である共有クラスローダーで使用可能である必要があります。(共有クラスローダーは、サーバー全体のリソースも同様に読み込みます。
server.policy ファイルが正しく設定されているかどうか、また、System.exec() を実行しようとしているライフサイクルモジュールがセキュリティアクセス違反を引き起こす可能性がないことを必ず確認してください。詳細は、「server.policy ファイル」を参照してください。
ライフサイクルモジュールに設定したプロパティは、プロパティとして INIT_EVENT に渡されます。JNDI 命名コンテキストは、INIT_EVENT では使用できません。ライフサイクルモジュールが命名コンテキストを必要とする場合、STARTUP_EVENT、READY_EVENT、または SHUTDOWN_EVENT 内で取得することができます。