程序化Jetty关闭

时间:2011-04-19 15:53:52

标签: java jetty embedded-jetty

如何以编程方式关闭嵌入式jetty服务器?

我像这样启动jetty服务器:

Server server = new Server(8090);
...
server.start();
server.join();

现在,我想将其从请求中关闭,例如http://127.0.0.1:8090/shutdown 我怎么干净利落地做?

通常建议的解决方案是创建一个线程并从该线程调用server.stop()。 但我可能需要调用Thread.sleep()以确保servlet已经完成处理关闭请求。

3 个答案:

答案 0 :(得分:6)

我找到了一个非常干净利落的方法here

魔术代码片段是: -

        server.setStopTimeout(10000L);;
        try {
            new Thread() {
                @Override
                public void run() {
                    try {
                        context.stop();
                        server.stop();
                    } catch (Exception ex) {
                        System.out.println("Failed to stop Jetty");
                    }
                }
            }.start();

因为关闭是从一个单独的线程运行的,所以它不会超过自身。

答案 1 :(得分:2)

尝试server.setGracefulShutdown(stands_for_milliseconds);

我认为它类似于thread.join(stands_for_milliseconds);

答案 2 :(得分:1)

建议不要通过HTTP请求远程关闭Jetty服务器,因为它提供了潜在的安全威胁。在大多数情况下,SSH应该足够SSH到托管服务器并在那里运行适当的命令来关闭Jetty服务器的相应实例。

基本思想是启动一个单独的线程作为Jetty启动代码的一部分(因此不需要在注释答案中提到的一个中按需),它将作为服务线程来处理关闭请求。在此线程中,ServerSocket可以绑定到localhost和指定端口,当收到预期消息时,它将调用server.stop()

This博客文章使用上述方法提供了详细的讨论。