编程式 Jetty 关闭

7

如何通过编程方式关闭嵌入式Jetty服务器?

我是用以下方式启动Jetty服务器的:

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

现在,我希望能够通过请求关闭它,例如http://127.0.0.1:8090/shutdown。如何干净地做到这一点?

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


3
有趣的是,谷歌搜索的第一个结果是一个关于这个问题的问题,并在该网站上给出了答案:https://dev59.com/yVPTa4cB1Zd3GeqPhkX8 - Jeff Swensen
1
它是如何启动的?请提供更多关于环境的信息,这样你就能得到更好的答案。 - Kennet
1
有点讽刺,是的。但这并不是一个完美的解决方案。使用这个方法,我需要在调用server.stop()之前找到一个正确的休眠时间。 - Anton Kazennikov
5
具有讽刺意味的是,现在对于“程序化停止Jetty服务器”的搜索结果,这个问题成为了Google的第一个搜索结果。 - Dexygen
3个回答

6
我发现了一个非常干净整洁的方法,在这里可以找到:这里 这个神奇的代码片段是:-
        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();

由于关闭操作是在一个单独的线程中运行的,它不会被自己绊倒。

2
尝试使用server.setGracefulShutdown(代表毫秒数);。我认为它类似于thread.join(代表毫秒数);

1

通过HTTP请求远程关闭Jetty服务器的能力不被推荐,因为它可能提供作为潜在安全威胁。在大多数情况下,只要SSH到托管服务器并在那里运行适当的命令即可关闭相应Jetty服务器的实例。

基本思路是作为Jetty启动代码的一部分启动一个单独的线程(因此不需要像评论答案中所述的一样休眠),该线程将用作服务线程来处理关闭请求。在此线程中,可以将ServerSocket绑定到本地主机和指定端口,当接收到预期消息时,它将调用server.stop()

这篇博客文章详细讨论了以上方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接