この章では、OC4Jの初期化後またはOC4Jの終了前に呼び出されるstartupクラスとshutdownクラスの開発のガイドラインについて説明します。startupクラスは、OC4Jの起動後にサービスを開始して機能を実行することができます。shutdownクラスは、OC4Jの終了前にこれらのサービスを終了して機能を実行することができます。
これらのクラスをコンパイルする場合、oc4j-api.jarファイルがORACLE_HOME/j2ee/home/oc4j-api.jarなどのJavaのCLASSPATH環境変数に指定されているパスに存在する必要があります。
OC4Jは、server.xmlファイルにおけるこれらのクラスの構成に基づいて、startupクラスとshutdownクラスをデプロイして実行します。
この章には、次の項目が含まれています。
startupクラスは、OC4Jの初期化後に1回のみ実行されます。server.xmlファイルが参照されるたびに再実行されることはありません。startupクラスは次の2つのメソッドを含むoracle.j2ee.server.OC4JStartupインタフェースを実装します。
preDeploy
このメソッドは、すべてのOC4Jアプリケーションの初期化前に実行されます。
postDeploy
このメソッドは、すべてのOC4Jアプリケーションの初期化後に実行されます。
これらのメソッドでは、サービスの開始、その他の初期化ルーチンの実行、サービスの終了、およびその他の終了ルーチンの実行のコードを実装できます。
それぞれのメソッドには次の2つの引数が必要です。
Hashtable
この引数は、構成から移入するハッシュ表を指定します。
Context
この引数は、コンテキスト内に含まれる値を処理するためにバインドすることができるJNDIコンテキストを指定します。
どちらのメソッドもString値を返しますが、現在は無視されています。
|
注意: startupクラスにコンストラクタを指定する場合、パブリックの引数なしコンストラクタを指定することを強くお薦めします。このようにしないと、このクラスのメンバー・メソッドをOC4Jが呼び出そうとした時点で、java.lang.IllegalAccessExceptionがスローされる可能性があります。 |
startupクラスを作成すると、server.xmlファイルの<startup-classes>要素で、startupクラスを構成する必要があります。このファイルにアクセスするには、Oracle Enterprise Manager 10g Application Server Controlを使用し、OC4Jのホームページで「拡張プロパティ」を選択します。各OC4JStartupクラスは、<startup-classes>要素内の単一の<startup-class>要素で定義されています。各<startup-class>要素では次の属性を定義します。
障害が致命的かどうか
デフォルトは非致命的です。致命的とみなされない障害に対する例外がスローされた場合、OC4Jは例外を記録して続行します。致命的とみなされる障害に対する例外がスローされた場合、OC4Jは例外を記録して終了します。
実行の順序
各startupクラスは整数を受け取ります。整数は0から始まり、クラスの実行順序を指定します。
OC4Jが受け取るString型のキー/値ペアを含む初期化パラメータ
初期化パラメータはHashtable引数の入力を介して指定されます。キー/値ペアの名前は、JNDIが各値をバインドするために使用するため、一意である必要があります。
server.xmlファイルの<init-library>要素では、startupクラスが存在するディレクトリ、またはクラスがアーカイブされているディレクトリとJARファイルを構成します。path引数は、完全修飾または/j2ee/instance/configに対する相対で指定できます。
たとえば、TestStartupクラスの構成は、server.xmlファイルの<startup-class>要素に含まれています。
failure-is-fatal属性がtrueであるため、例外が発生するとOC4Jは終了します。
<execution-order>サブ要素が0を含んでいるため、これが最初に実行されるstartupクラスとなります。
2つの初期化キー/値ペアは、String型に定義されます。これらのキー/値ペアは、Hashtable引数が指定するハッシュ表に移入されます。
"oracle.test.startup" "true" "startup.oracle.year" "2002"
|
注意: キー/値ペアの名前は、JNDIが名前と値をバインドするため、すべてのstartupクラスとshutdownクラスで一意である必要があります。 |
TestStartupクラスを定義するには、server.xmlファイルに次の記述を追加します。
<startup-classes>
<startup-class classname="test.oc4j.TestStartup" failure-is-fatal="true">
<execution-order>0</execution-order>
<init-param>
<param-name>oracle.test.startup</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>startup.oracle.year</param-name>
<param-value>2008</param-value>
</init-param>
</startup-class>
</startup-classes>
コンテナは、この2つの初期化キー/値ペアをstartupクラスに対する入力Hashtable引数内に提供します。
次の例で示すTestStartupは、oracle.j2ee.server.OC4JStartupインタフェースを実装しています。preDeployメソッドは、ハッシュ表からキー/値ペアを取得して出力します。postDeployメソッドはnullメソッドです。TestStartupをコンパイルするときは、JavaのCLASSPATH環境変数が指定するパスにoc4j.jarファイルが存在している必要があります。
package text.oc4j;
import oracle.j2ee.server.OC4JStartup;
import javax.naming.*;
import java.util.*;
public class TestStartup implements OC4JStartup {
//public, no-argument constructor
public TestStartup() {
}
public String preDeploy(Hashtable args, Context context) throws Exception {
// bind each argument using its name
Enumeration keys = args.keys();
while(keys.hasMoreElements()) {
String key = (String)keys.nextElement();
String value = (String)args.get(key);
System.out.println("prop: " + key + " value: " + args.get(key));
context.bind(key, value);
}
return "ok";
}
public String postDeploy(Hashtable args, Context context) throws Exception {
return null;
}
}
TestStartupクラスが"../app1/startup.jar"にアーカイブされているとする場合、server.xmlファイルの<init-library>要素を次のように変更します。
<init-library path="../app1/startup.jar" />
OC4Jを起動すると、すべてのアプリケーションが初期化される前にTestStartupのpreDeployメソッドが実行されます。OC4Jは、ハッシュ表の値をJNDIコンテキストに移入します。failure-is-fatal属性がtrueに設定されているので、TestStartupが例外をスローすると、OC4Jは終了します。
shutdownクラスは、OC4Jが終了する前に実行されます。shutdownクラスが実装するoracle.j2ee.server.OC4JShutdownインタフェースにはpreUndeployとpostUndeployという2つのメソッドが含まれており、これらの中に、サービスを終了したり他の終了ルーチンを実行したりするコードを実装できます。
preUndeployメソッドは、すべてのOC4Jアプリケーションが終了する前に実行されます。
postUndeployメソッドは、すべてのOC4Jアプリケーションが終了した後で実行されます。
各メソッドに必要な引数は、構成から移入されるハッシュ表と、キー/値ペアに指定された値を処理するためにバインドできるJNDIコンテキストの2つです。
|
注意: shutdownクラスにコンストラクタを指定する場合、パブリックの引数なしコンストラクタを指定することを強くお薦めします。このようにしないと、このクラスのメンバー・メソッドをOC4Jが呼び出そうとした時点で、java.lang.IllegalAccessExceptionがスローされる可能性があります。 |
shutdownクラスの実装と構成は「startupクラスの開発」での説明とほとんど同じですが、構成は<shutdown-classes>要素と<shutdown-class>要素で定義されており、failure-is-fatal属性はありません。したがって、TestShutdownクラスの構成は次のようになります。
<shutdown-classes>
<shutdown-class classname="test.oc4j.TestShutdown">
<execution-order>0</execution-order>
<init-param>
<param-name>oracle.test.shutdown</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>shutdown.oracle.year</param-name>
<param-value>2008</param-value>
</init-param>
</shutdown-class>
</shutdown-classes>
TestShutdownクラスが"/j2ee/home/app1/shutdown.jar"にアーカイブされているとする場合、server.xmlファイルに次のようなもう1つの<init-library>要素を追加します。
<init-library path="../app1/shutdown.jar" />