Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

FileLockを使用した多重起動制御

FileLockで排他制御をかけました。
isValid、isShardでロックの状態を取得したところ正常にbooleanで値を取得できました。
しかし同じjarファイルが起動してしまいます。
状況としては、Eclipseで実行可能jarをexportした物を実行しています。
処理の概要としては、定周期処理前の初期処理段階でファイルロック処理を行い、その後時間が来るまで待機状態にする。同じjarファイルを起動させると排他制御されずに起動してしまいます。
Javaのバージョンは1.8.0_131です。
同様な事象または改善する方法はありますでしょうか?
また排他制御は同じjarに有効でしょうか?検索しましたが有用な情報が見つからなかったので質問しました。よろしくお願いします

3

回答

171

閲覧

3件の回答

評価

0

>同様な事象または改善する方法はありますでしょうか?
そもそも事象が再現できない。

>排他制御は同じjarに有効でしょうか?
ファイル排他はjarに対してではなく、何らか書き込み可能なファイルに対して行うものだが、
いったいどんな実装をしているのだろうか?

評価

0

質問主です。
原因が特定できましたので記載します。

FileChannel fc = FileChannel.open(lockFile.toPath(), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
             FileLock lock = fc.tryLock()) {
            if (lock == null) { ←nullが返ってこない
              }
※公式のJavaSE8のFileChannelに以下の記述がありますが呼び出し方が悪いのかnullがかえって来ませんでした。
・tryLock();
戻り値:新規獲得ロックを表すロック・オブジェクト。オーバーラップしたロックが別のプログラムによって確保されていたためロックに失敗した場合はnull
nullの条件に当てはまらなかったので終了処理が行われず二重起動していたようです。

原因は判明しましたが別の方法でFileの状態を取得できるか模索中です。

評価

0

ちなみに自分のコードはこうだ。
try (FileOutputStream fos = new FileOutputStream(path.toFile());
    FileChannel fc = fos.getChannel();
    FileLock fl = fc.tryLock();

回答する

ログインしていません。

ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 アカウントをお持ちでない方は会員登録を行ってください。

ユーザ名匿名