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