この章では、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クラスを構成する必要があります。このファイルにアクセスするには、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>2002</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>2002</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" />