我正在開發Java應用程序。我想阻止用戶同時運行同一個Java應用程序的更多實例。我使用Java的JUnique應用程序鎖定庫,它效果很好。但是當它崩潰時會遇到一個嚴重的問題。如果應用程序崩潰,JUnique鎖定的應用程序不會運行
應用程序如果崩潰就無法啓動,它只是返回AlreadyLockedException。下面是我用來鎖定我的應用程序的代碼。
public static boolean isRunning() {
boolean alreadyRunning = false;
try {
JUnique.acquireLock(appId);
alreadyRunning = false;
} catch (AlreadyLockedException e) {
logger.error("Unable to acquire lock. There is an instance already running");
alreadyRunning = true;
} catch (Throwable t) {
logger.error("Unable to acquire lock. ", t);
}
return alreadyRunning;
}
和代碼來釋放我的鎖是:
public static void release() {
try {
JUnique.releaseLock(appId);
} catch (Throwable t) {
logger.error("Error releasing the lock", t);
}
}
我可以使用release()方法來處理預期的崩潰。但真正的問題發生在運行時應用程序意外崩潰。應用程序終止而不釋放獲取的應用程序鎖。
如果應用程序意外崩潰,我們該如何釋放JUnique鎖定?
定義「崩潰」。該文檔聲明鎖定「將在JVM暫停時自動釋放」。另外,打印併發布該'AlreadyLockedException'的堆棧跟蹤。 – chrylis 2014-08-29 08:47:19
您可以嘗試註冊['Thread.UncaughtExceptionHandler'](http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html) – MadProgrammer 2014-08-29 08:58:11
@chrylis,這就是它釋放鎖,但如果其他程序也在運行JVM,那麼JVM不會停止。即使我的應用程序崩潰,鎖仍然會存在於JVM中。 – Crawler 2014-08-29 10:02:46