[英]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.