如果应用程序崩溃,JUnique锁定的应用程序不会运行

时间:2014-08-29 08:40:01

标签: java multithreading swing uncaughtexceptionhandler

我正在开发一个Java应用程序。我想阻止用户同时运行同一Java应用程序的更多实例。我使用JUnique app锁定库来实现Java,它运行得很好。但是当它崩溃时会有一个严重的问题。

如果应用程序崩溃,则无法启动它,它只返回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锁?

1 个答案:

答案 0 :(得分:3)

这是JUnique的设计缺陷(我发现here的最新版本)。根本不支持计算机崩溃的用例(BSOD,电源中断)。假设始终执行ShutdownHook(删除锁,请参阅JUnique.java)。这个漏洞在releaseLock api-docs中很明显:

"请注意,锁只能由之前获取锁的同一JVM重新发布。如果给定的ID不对应于属于当前JVM的锁,则不会采取任何操作。"

但是没有方法forceReleaseLock(String id)反过来意味着在计算机崩溃后,无法再启动应用程序。

在这种情况下,向用户呈现带有消息的对话框是很常见的,并且#34;应用程序已在运行"和#34;好的"按钮,显示正在运行的应用程序的窗口。在这种情况下,你可以添加一个按钮"不,它不是"点击时:

  • 检查应用程序没有打开的窗口。
  • 检查JUnique.sendMessage是否返回null。
  • 删除new File(System.getProperty("user.home"), ".junique");(LOCK_FILES_DIR,请参阅JUnique.java)的内容,或类似的原始内容。
  • 启动申请。