###やりたいこと
Javaのバッチ処理アプリケーションを作成する。
アプリケーションにはロックファイルのロック状態を参照して、ロック中ならそこで処理終了することによりアプリケーションの二重起動を防ぐ機能を持たせる。
発生している問題・エラーメッセージ
Windows環境で、Jar形式にしたJavaアプリケーションの動作確認を行っているが、場合により二重起動が防止できない。
java
1 2public class XXXMain { 3 4 public static void main(String[] args) { 5 boolean ret = false; 6... 7 //起動チェック 8 try { 9... 10 String lockFileName = logPath + "/XXX.lock"; 11 final FileOutputStream fos = new FileOutputStream(new File(lockFileName)); 12 final FileChannel fc = fos.getChannel(); 13 final FileLock lock = fc.tryLock(); 14 if (lock == null) { 15 //既に起動されているので終了する 16 logger.info("既に起動されているので終了する"); 17 System.exit(1); 18 } 19 20 //ロック開放処理を登録 21 Runtime.getRuntime().addShutdownHook( 22 new Thread() { 23 public void run() { 24 try { 25 if (lock != null && lock.isValid()) { 26 lock.release(); 27 } 28 fc.close(); 29 fos.close(); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } 33 } 34 } 35 ); 36 37 XXXLogic class1 = new XXXLogic(); 38 39 class1.setApplicationPath(mainClassPath); // アプリケーションのパス設定 40 ret = class1.dologic(logger, props); // メール編集->DB登録処理メイン 41 42... 43 System.exit(0); 44 } catch (Exception e) { 45 e.printStackTrace(); 46 System.exit(2); 47 } 48 49 } 50} 51
試したこと
・コマンドプロンプトを2つ開いて、コマンドプロンプト(1)とコマンドプロンプト(2)でほぼ同時にアプリケーションを開始する
→両方のアプリケーションが二重起動チェックの箇所を越えてメイン処理が実行されてしまう。
(後に実行した方のアプリケーションがファイルロック箇所で処理終了してほしい)
・Eclipseをデバッグ実行して、ファイルロックをかけた状態でデバッガで停止させた状態
→コマンドプロンプトからJar形式のアプリケーションを実行する
→コマンドプロンプトから実行したアプリケーションはファイルロック箇所で処理終了する。
補足情報(FW/ツールのバージョンなど)
Java1.8
Eclipse環境で実行、Jar形式をコマンドプロンプトから実行
回答2件
あなたの回答
tips
プレビュー