【问题标题】:how can i avoid running of more than one instance on same java project at the same time?如何避免在同一个 java 项目上同时运行多个实例?
【发布时间】:2011-03-03 13:42:44
【问题描述】:

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

【问题讨论】:

标签: java


【解决方案1】:
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);
    }
}

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

【讨论】:

  • +1 好主意!我看到这个解决方案的唯一问题是它不允许不同的应用程序使用相同的端口。如果您记得为每个应用程序分配另一个端口,那也没关系。如果您将端口保存在属性文件中,您还可以重新配置端口并避免第三方应用程序出现问题。
  • @Costis,这可能是一个安全的假设,有问题的软件是服务器,很有可能会在特定端口上列出一些东西。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 2016-10-26
        • 1970-01-01
        • 2019-05-21
        • 2022-01-09
        • 1970-01-01
        相关资源
        最近更新 更多