簡體   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