Cosminexus 機能解説

[目次][用語][索引][前へ][次へ]

15.2.2 バッチアプリケーション作成時の注意

ここでは,バッチアプリケーション作成時に注意が必要となる処理や,バッチアプリケーションでは使用できない機能について説明します。これらの内容を確認の上,バッチアプリケーションを作成してください。

<この項の構成>
(1) 注意が必要な処理
(2) バッチアプリケーションで実装できない機能

(1) 注意が必要な処理

次に示す処理は,バッチアプリケーションを作成する際に注意が必要です。

ファイルやディレクトリの操作

バッチアプリケーションでは,次に示すファイルやディレクトリは操作しないでください。

また,バッチアプリケーションでファイルやディレクトリを扱う場合,ファイルやディレクトリのパスに相対パスを使用できません。cjexecjobコマンドを実行したディレクトリからの相対パスを取得したい場合は,ejbserver.batch.currentdirの値を使用してください。ejbserver.batch.currentdirについては,マニュアル「Cosminexus リファレンス API編」を参照してください。

次に,バッチアプリケーションの修正例を示します。

修正前
File f = new File("DataFile.txt");

修正後
File f = new File(System.getProperty("ejbserver.batch.currentdir") + System.getProperty("file.separator") + "DataFile.txt");
スレッドの使用

バッチサーバは,バッチアプリケーションが作成および開始したスレッドの終了を待ちません。バッチアプリケーション内でスレッドを使用する場合は,バッチアプリケーションを終了する前に,開始したすべてのユーザスレッドを完了するように実装してください。また,ユーザスレッドはメソッドキャンセルの対象外です。

バッチアプリケーションが作成したスレッドが残っていると,バッチアプリケーションのクラスや使用したリソースは解放されません。このため,次にバッチアプリケーションを開始しようとすると,バッチアプリケーションの開始に失敗するおそれがあります。また,ユーザスレッド内では,「3.2 バッチアプリケーション実行基盤の機能の概要」で説明しているバッチサーバの機能を呼び出すことはできません。

●JavaVM終了時のリソースの自動クローズ

バッチサーバではサーバのJavaVM上でバッチアプリケーションを実行します。このため,JavaVM終了による自動的なリソースのクローズ処理を期待した実装をしている場合は,メモリやファイルディスクリプタのリークが発生します。例えば,次の場合にリークが発生します。

この問題を回避するためには,リソースが正しくクローズされるようにバッチアプリケーションを実装してください。

また,ファイルやソケットなども明示的にクローズしていないと,リソース解放のタイミングが不定になります。これによって,次回以降のバッチアプリケーションの実行に影響を及ぼすおそれがあります。ファイルやソケットは明示的にクローズするようにしてください。

なお,バッチサーバの場合,コネクションの自動クローズは使用できません。バッチアプリケーション内で必ずコネクションをクローズしてください。

(2) バッチアプリケーションで実装できない機能

次に示す機能はバッチアプリケーションでは使用できません。「対処方法」に示す手段で対応してください。

●標準入力からの入力

java.lang.System.inなどを使用した標準入力からの入力処理はできません。

対処方法
入力処理が必要な場合はファイルを使用してください。
●シャットダウンフックの使用

シャットダウンフックは使用できません。

対処方法
バッチアプリケーション終了時に実施したい処理がある場合は,mainメソッドのfinallyブロック内に処理を記述してください。
●JNIの使用

JNI経由でのネイティブライブラリの実行機能は使用できません。

対処方法
JNIを使用する場合は,コンテナ拡張ライブラリ経由で使用してください。このとき,ネイティブライブラリのロードはコンテナ拡張ライブラリ内で実施します。
●JavaVM終了メソッドの使用

次に示すメソッドは使用できません。

これらのメソッドを使用した場合は,バッチサーバごとJavaVMが終了します。

対処方法
public static int main(String[])メソッドにバッチ処理の内容を記述します。終了コードを返す場合は,return <終了コード>を使用します。ただし,returnを使用する場合は,finallyブロックが実行されます。
●システムプロパティのセットの置き換え

次に示すメソッドは使用できません。

対処方法
java.lang.System.setProperty(String, String)を使用します。
●標準出力ストリームおよび標準エラー出力ストリームの割り当てのし直し

次に示すメソッドは使用できません。

対処方法
java.lang.System.outおよびjava.lang.System.errを使用しないで,出力したいPrintStreamオブジェクトを直接使用します。