临时文件,单实例锁和进程终止(Java)

时间:2010-08-10 00:45:22

标签: java windows file locking temporary-files

我目前正在为我的Java应用程序使用临时文件夹来创建锁,以便一次只能运行一个实例。程序退出时,必须删除此锁定文件。

这很好,除了进程被终止的情况(不允许正常关闭,例如从Windows任务管理器)。如果发生这种情况,用户将永远无法再次运行程序... eek

有人有建议吗?有没有办法让操作系统在重启时删除文件夹或类似的东西?我应该找到另一种方法来实现“单实例锁定吗?”

此外,如果可能,解决方案应该是跨平台的......

3 个答案:

答案 0 :(得分:3)

我认为提到的锁定文件是一个很好的方法: - 在应用程序启动时,检查锁定文件 - 如果它不存在,则创建它并存储该进程的id 在该文件中创建文件 - 如果它确实存在,请读取文件中的pid并查看该进程是否存在 仍在运行 - 如果没有,请替换锁定文件并在其中存储您自己的进程ID - 如果进程仍在运行,则返回错误并退出

使用this(javasysmon)获取PID以及框中正在运行的进程

您应该在主服务器中添加一个ShutDownHook来清理文件夹,这将占用大部分终端。

为了更可靠地挂钩JVM,请看本文:
http://www.ibm.com/developerworks/java/library/i-signalhandling/

答案 1 :(得分:1)

当应用程序启动时,请检查锁定文件,如果存在,则打印错误,说明某些内容:“有另一个实例正在运行,或者您有一个过时的锁定。如果没有其他实例在运行,删除xyz.lock并重新启动“。

更好的解决方案可能是绑定到固定(和非标准)TCP端口。如果您无法绑定它,请假设您的进程的另一个实例正在运行。

第三,可能最好的方法是使用java.nio.channels.FileLock对文件进行独占锁定。

答案 2 :(得分:0)

您可以查看File.deleteOnExit()。它使JVM在退出时删除该文件。它无法撤消。

但与其他答案一样,您需要在启动时检查它是否存在。