我创建了一个java SE应用程序。我已经导出了一个在linux机器上运行的runnable jar。并使用在Windows上运行的相同jar创建了exe文件。
如果我多次运行exe,则会创建多个实例(任务管理器中的javaw.exe)如何防止这种情况?
我想阻止它。为此,我最初试图检查服务器是否正在运行,但我在static main()
方法中使用它。并且Server类的isRunning()
方法是非静态的。
我需要在windows和linux os上运行应用程序。
代码:
public static void main(String[] args) {
try {
if(Server.isRunning()){ // compilation error
}
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(8080);
server.addConnector(connector);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
// Initialize javax.websocket layer
ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext(context);
// Add WebSocket endpoint to javax.websocket layer
wscontainer.addEndpoint(EventSocket.class);
server.start();
server.dump(System.err);
server.join();
} catch (Throwable t) {
logger.error("Server Error : " + t.getMessage(), t);
}
}
答案 0 :(得分:1)
创建单个实例服务器应用程序的目标应该非常简单。您可以依赖于无法两次绑定到端口8080的事实。至少它是如何在Linux上运行的。 :)
这意味着server.start();
可能会因一些有意义的异常而失败 - 您捕获它并终止应用程序。这应该发生在所有其他实例上,直到端口被释放。
当然,有一些方法可以本地创建单实例应用程序(EXE包装器应该有一个选项,等等),但在这里我会使用端口锁定。