Eclipse Jetty Server单实例应用程序

时间:2016-09-27 07:51:06

标签: java linux websocket jetty

我创建了一个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);
    }
}

1 个答案:

答案 0 :(得分:1)

创建单个实例服务器应用程序的目标应该非常简单。您可以依赖于无法两次绑定到端口8080的事实。至少它是如何在Linux上运行的。 :)

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

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