如何以编程方式关闭嵌入式jetty服务器?
我像这样启动jetty服务器:
Server server = new Server(8090);
...
server.start();
server.join();
现在,我想将其从请求中关闭,例如http://127.0.0.1:8090/shutdown 我怎么干净利落地做?
通常建议的解决方案是创建一个线程并从该线程调用server.stop()。 但我可能需要调用Thread.sleep()以确保servlet已经完成处理关闭请求。
答案 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博客文章使用上述方法提供了详细的讨论。