Javaで同時に同じプロセスを実行するのを防ぐことって出来るんでしょうか?
以前は、Javaを起動するネイティブの実行モジュールを作ってネイティブのプログラム内で排他制御していましたが、現在はファイルロックを使えば排他制御ができるようです。
JavaのFileChannel, FileLock
ファイルロックは、FileLockを返すオブジェクト(FileChannel)のtryLockメソッドを使用してロックする。
このメソッドは、他プロセスがそのファイルをロック中だとnullを返すので、ロックされているかどうかを判定できる。
FileLockオブジェクトやその元になったFileChannelをクローズしてしまうとロックは解除される。
ファイルをロック中のプロセスが外部からkillされても、ファイルロックは解除される。
クラス FileLockのJavaDoc
・https://docs.oracle.com/javase/jp/7/api/java/nio/channels/FileLock.html
クラス FileChannelのJavaDoc
・https://docs.oracle.com/javase/jp/7/api/java/nio/channels/FileChannel.html
ファイルロックを使ったプロセス排他制御のサンプル
Javaでファイルロックを使ってプロセス間の排他制御、二重起動防止を行うには以下のようにすればよいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
File lockFile; if (System.getProperty("os.name").toLowerCase().startsWith("windows")) { lockFile = new File("test.lock"); } else { lockFile = new File("/tmp/test.lock"); } try (FileChannel fc = FileChannel.open(lockFile.toPath(), StandardOpenOption.CREATE, StandardOpenOption.WRITE); FileLock lock = fc.tryLock()) { if (lock == null) { System.exit(-1); } //処理実行 } catch (Exception e) { System.exit(-99); } |
コメント