Eclipse Jetty 服务器单实例应用程序

Eclipse Jetty Server Single Instance Application

我已经创建了一个 java SE 应用程序。我导出了一个 运行nable jar,它 运行s 在 linux 机器上。并使用 windows.

上 运行 的相同 jar 创建了 exe 文件

如果我多次 运行 exe,将创建多个实例(在任务管理器中 javaw.exe)我该如何防止这种情况?

我想阻止这种情况。为此,最初我试图检查服务器是否为 运行ning,但我在 static main() 方法中使用它。服务器 class 的 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);
    }
}

您创建单实例服务器应用程序的目标应该非常简单。你可以相信你不能绑定到端口 8080 两次。至少在 Linux 上是这样的。 :)

这意味着 server.start(); 可能会因一些有意义的异常而失败 - 您捕获它并终止应用程序。这应该发生在所有其他实例上,直到端口被释放。

当然,有一些方法可以本地创建单实例应用程序(EXE 包装器应该有一个选项,等等)但在这里我会使用端口锁定。