我的朋友在接受採訪時曾提出以下問題(S):同時讓應用程序只有一個實例
您將如何確保有一個應用程序只有一個實例(如tomcat)一次運行?
當一個應用程序的另一個實例啓動時,應當顯示一個錯誤消息說一個實例已在運行
當應用程序異常終止,我們應該可以啓動應用程序。
我對上述問題的回答涉及到端口。有沒有人對上述問題有更深入的瞭解?
我的朋友在接受採訪時曾提出以下問題(S):同時讓應用程序只有一個實例
您將如何確保有一個應用程序只有一個實例(如tomcat)一次運行?
當一個應用程序的另一個實例啓動時,應當顯示一個錯誤消息說一個實例已在運行
當應用程序異常終止,我們應該可以啓動應用程序。
我對上述問題的回答涉及到端口。有沒有人對上述問題有更深入的瞭解?
夫婦的可能性,以檢查應用程序已經運行的情況下,我敢肯定有很多更多:
顯示,如果一個實例已在運行的消息是微不足道正在運行(只顯示我並退出)
編輯:@rtang使用PID文件仍然可以導致問題,如果另一個進程在應用程序崩潰後收到相同的PID。在這種情況下,除非手動刪除文件,否則您的應用程序將無法啓動。
你說得對。您可以通過以下方法縮小問題的範圍:使用該PID解析程序的名稱或使用某種信號處理程序(例如EXIT上的「陷阱」)來刪除PID文件等。 – 2012-04-16 12:49:22
我建議你使用「PID文件」。
例如,您可以在啓動應用程序時創建PID文件(例如在/var/run/mypgm.pid
下)。在該pid文件中存儲應用程序的PID(進程ID)。當你關閉你的應用程序時(清理)你刪除該PID文件。
現在,當您第二次啓動應用程序時,請檢查該PID文件是否存在。如果該文件存在,你有兩個選擇:
現在你可以解析該PID文件來檢查是否仍然有一個進程運行該PID。如果是這樣,則顯示錯誤消息。如果沒有,您只需刪除PID文件並啓動您的應用程序。
java.nio.channels.FileLock可以幫你匹配所有三點(包括異常終止的情況下)。
該示例是here。
請參閱http://stackoverflow.com/questions/2528844/only-one-swing-frame-window-opened-at-time/2528860#2528860 – 2012-04-16 09:11:29
我也會使用一個端口。簡單的答案往往是最好的,所以也許沒有更深的理解。我能想到的唯一技巧是在綁定到端口之前使用'socket.setReusableAddress(true)'**。你有什麼疑問? – 2012-04-16 09:11:32