我的朋友在接受采访时曾提出以下问题(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