ここでは,バッチアプリケーション作成時に注意が必要となる処理や,バッチアプリケーションでは使用できない機能について説明します。これらの内容を確認の上,バッチアプリケーションを作成してください。
次に示す処理は,バッチアプリケーションを作成する際に注意が必要です。
バッチアプリケーションでは,次に示すファイルやディレクトリは操作しないでください。
また,バッチアプリケーションでファイルやディレクトリを扱う場合,ファイルやディレクトリのパスに相対パスを使用できません。cjexecjobコマンドを実行したディレクトリからの相対パスを取得したい場合は,ejbserver.batch.currentdirの値を使用してください。ejbserver.batch.currentdirについては,マニュアル「アプリケーションサーバ リファレンス API編」の「ejbserver.batch.currentdirプロパティ」を参照してください。
次に,バッチアプリケーションの修正例を示します。
File f = new File("DataFile.txt");
File f = new File(System.getProperty("ejbserver.batch.currentdir") + System.getProperty("file.separator") + "DataFile.txt");
バッチサーバは,バッチアプリケーションが作成および開始したスレッドの終了を待ちません。バッチアプリケーション内でスレッドを使用する場合は,バッチアプリケーションを終了する前に,開始したすべてのユーザスレッドを完了するように実装してください。また,ユーザスレッドはメソッドキャンセルの対象外です。
なお,簡易構築定義ファイルでejbserver.batch.application.exit.enabledパラメタで「true」を指定した場合には,次の点に注意してください。
バッチアプリケーションが作成したスレッドが残っていると,バッチアプリケーションのクラスや使用したリソースは解放されません。このため,次にバッチアプリケーションを開始しようとすると,バッチアプリケーションの開始に失敗するおそれがあります。また,ユーザスレッド内では,次のバッチサーバの機能を呼び出すことはできません。
バッチサーバではサーバのJavaVM上でバッチアプリケーションを実行します。このため,JavaVM終了による自動的なリソースのクローズ処理を期待した実装をしている場合は,メモリやファイルディスクリプタのリークが発生します。例えば,次の場合にリークが発生します。
この問題を回避するためには,リソースが正しくクローズされるようにバッチアプリケーションを実装してください。
また,ファイルやソケットなども明示的にクローズしていないと,リソース解放のタイミングが不定になります。これによって,次回以降のバッチアプリケーションの実行に影響を及ぼすおそれがあります。ファイルやソケットは明示的にクローズするようにしてください。
なお,バッチサーバの場合,コネクションの自動クローズは使用できません。バッチアプリケーション内で必ずコネクションをクローズしてください。
簡易構築定義ファイルでejbserver.batch.application.exit.enabledパラメタに「true」を指定すると,次のJavaVM終了メソッドが使用できます。
ejbserver.batch.application.exit.enabledパラメタの設定については,「2.3.10 実行環境での設定(バッチサーバの設定)」を参照してください。なお,JavaVM終了メソッドを使用する場合の注意事項については,「(3) JavaVM終了メソッド使用時の注意」を参照してください。
簡易構築定義ファイルでejbserver.batch.application.exit.enabledパラメタに「true」を指定すると,次の場合にシャットダウンフックが使用できます。
ejbserver.batch.application.exit.enabledパラメタの設定については,「2.3.10 実行環境での設定(バッチサーバの設定)」を参照してください。
次に示す機能はバッチアプリケーションでは使用できません。「対処方法」に示す手段で対応してください。
java.lang.System.inなどを使用した標準入力からの入力処理はできません。
JNI経由でのネイティブライブラリの実行機能は使用できません。
次に示すメソッドは使用できません。
次に示すメソッドは使用できません。
簡易構築定義ファイルでejbserver.batch.application.exit.enabledパラメタに「true」を指定すると,バッチアプリケーションでJavaVM終了メソッドを使用しても,JavaVMは終了されません。この場合,JavaVM終了メソッドが呼び出したスレッドだけを終了できます。
ここでは,ejbserver.batch.application.exit.enabledパラメタに「true」を指定している場合に,JavaVM終了メソッドを使用するときの注意事項について説明します。
バッチアプリケーションで使用するJavaVM終了メソッドは,Java言語仕様と仕様が異なります。Java言語仕様との差異を次の表に示します。
表2-10 Java言語仕様との差異
項目 | Java言語仕様の場合 | バッチアプリケーションの場合 |
---|---|---|
終了対象 | JavaVM | JavaVM終了メソッドを呼び出したスレッド |
呼び出し以降に記述されたjavaロジック | JavaVM終了メソッドの呼び出し以降に記述されている処理は実行されません。 | 次の場合,JavaVM終了メソッドの呼び出し以降に記述されている処理は実行されます。
|
複数回呼び出し | 使用できません。 | 次の場合に複数回呼び出されます。
|
注※1 finallyブロック内およびfinallyブロック内で呼び出されたメソッド内で例外が発生し,その例外がfinallyブロックでキャッチされないでfinallyブロックの実行が途中で中断された場合は,スレッドが終了できないときがあります。
また,次の場合,スレッドの終了に時間が掛かったり,スレッドが終了できなかったりするときがあります。
なお,時間の掛かるJavaプログラムの処理には,無限ループ,synchronized文によるモニタ待ち,java.lang.wait()による待ちなどがあります。
注※2 ユーザスレッドとは,バッチアプリケーションが作成した子スレッドを示します。ユーザスレッドを使用している場合は,次の点に注意してください。
バッチアプリケーションごとに,JavaVM終了メソッドを呼び出した場合の処理を説明します。
表2-11 JavaVM終了メソッドが複数回呼び出された場合の動作(シングルスレッドで実装されたバッチアプリケーションの場合)
項番 | 項目 | 動作 |
---|---|---|
1 | バッチアプリケーション実行機能への終了通知 | 1回目のJavaVM終了メソッド呼び出し時にだけ終了を通知します。 2回目以降のJavaVM終了メソッド呼び出し時には通知しません。 |
2 | 終了コードの返却 | 1回目のJavaVM終了メソッド呼び出し時に引数に指定された終了コードが有効となります。 2回目以降のJavaVM終了メソッド呼び出し時に引数に指定された終了コードは無効となります。 |
3 | JavaVM終了メソッドを呼び出したスレッド | JavaVM終了メソッドの呼び出し回数に関係なく,スレッドが終了します。 |