繁体   English   中英

如何避免在同一java项目上同时运行多个实例?

[英]how can i avoid running of more than one instance on same java project at the same time?

我有一个Java项目,可以用作服务器。 当该项目的一个实例运行时,我可以运行另一个实例。
如何避免在同一java项目上同时运行多个实例? (在检测到另一个实例时停止服务器)

import java.net.ServerSocket; 
..... 
private static final int PORT = 9999;
private static ServerSocket socket;  
public static void main(String[] args) {

    try {
        socket = new ServerSocket(PORT, 0, InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }));

                {/*here write your own code taht must be run in the main*/}

    } catch (BindException e) {
        System.err.println("**********************************Already running.");
        System.exit(1);
    } catch (IOException e) {
        System.err.println("************************************Unexpected error.");
        e.printStackTrace();
        System.exit(2);
    } catch (Exception e) {
        System.err.println("************************************ Error");
        System.exit(3);
    }
}

我用了这段代码,它可以尝试

最简单的方法是使用锁定文件,如果应用程序崩溃,这会导致问题。 尝试将pid写入锁定文件,您可以检查该pid是否存在(尽管可能不是包装外壳脚本中的本机)。

如果您正在运行服务器,则无法检查端口是否已打开,或者最好检查已知端口上的jmx实例。

我完全支持@vickirk-他的方法允许服务器的第二个“不需要”实例变为“休眠”,而不是简单地终止,即定期运行以检查“活动”实例是否仍然处于活动状态/存在,并且如果倒下了,接手。

在分布式情况下,如果要求具有跨多台计算机的单个服务器实例,则方法仍然是找到可以物理或逻辑锁定的公共资源。 为此,我个人使用控制数据库表,其中活动进程写入其PID和“心跳”,所有其他进程都在检查该“心跳”是否相当新,如果不是,则变为活动状态。

您可以编写用于启动应用的简单命令行脚本-检查服务器是否在实际运行新实例之前运行。 例如,只需使用wget检查网址...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM