程序化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()
。
此博客文章使用上述方法提供了详细的讨论。
- Jetty WebSocket api与标准JSR 356 API相比
- 使用jackson将json反序列化为java – 特殊字符问题
- Jetty Classpath问题
- 如何让Jetty动态加载“静态”页面
- 请求Content-Type为gzip时,Jetty会响应400 Bad Request
- “java.net.BindException:地址已经在使用:JVM_Bind”当我在eclipse mars中启动Jetty时
- 无法从另一个maven子项目调用Hibernate / QueryDSL
- 在Jetty中运行的Web应用程序中使用CAC(通用访问卡)对用户进行身份validation,以获取美国政府机构使用的应用程序
- 如何在Java servlet Web应用程序中获取未捕获的exception