程序化Jetty关闭

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

我像这样启动jetty服务器:

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

现在,我想从请求中关闭它,例如http://127.0.0.1:8090/shutdown如何干净利落地完成它?

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

我在这里找到了一个非常干净利落的方法

神奇的代码片段是: –

  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(); 

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

尝试server.setGracefulShutdown(stands_for_milliseconds);

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

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

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

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