如何优雅地关闭嵌入式docker

我有一个应用程序在嵌入式jetty服务器上运行。 现在我想启动/停止服务器作为服务。 我使用脚本启动服务器。

java $JAVA_OPTS -DREQ_JAVA_VERSION=$JAVA_VERSION -jar myjetty.jar 

主类

 Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setPort(PORT); server.addConnector(connector); HandlerCollection handlers = new HandlerCollection(); NCSARequestLog requestLog = new NCSARequestLog(); requestLog.setFilename(home + "/logs/access_" + logFileDateFormat + ".log"); requestLog.setFilenameDateFormat(logFileDateFormat); requestLog.setRetainDays(10); requestLog.setAppend(true); requestLog.setExtended(false); requestLog.setLogCookies(false); requestLog.setLogTimeZone(TimeZone.getDefault().getID()); RequestLogHandler requestLogHandler = new RequestLogHandler(); requestLogHandler.setRequestLog(requestLog); handlers.addHandler(requestLogHandler); server.setHandler(handlers); server.start(); server.join(); 

这启动了服务器。 通过Web调用停止和/或重新启动嵌入式Jetty实例可用于停止服务器但是,如何从脚本中停止服务器? 我应该做什么改变来喊出主类中的服务器。

没有预定义的解决方案来关闭Jetty服务器。 关闭Jetty服务器的唯一有序方法是在正在运行的服务器实例上调用方法stop() 。 您必须实现自己调用此方法的方式。

你可以通过…实现这个(例如)

  • 实现RMI服务器线程并从RMI客户端调用该方法
  • 实现JMX MBean并从客户端调用该MBean上的方法
  • 实现自定义处理程序,如您发布的链接中所述

如果您只想找到一种不依赖于curl等其他工具的方法,那么您可以解决它,例如下面的方法(这是您自己的代码,只需要很少的修改)

 public class MyJetty { public static void main(String[] args) throws Exception { int PORT = 9103; String home = System.getProperty("user.home"); String logFileDateFormat = "yyyy_MM_dd"; // execute a request to http://localhost:9103/stop // instead of `curl -v http://localhost:9103/stop` if (args.length == 1 && "stop".equalsIgnoreCase(args[0])) { URL url = new URL("http", "localhost", PORT, "/stop"); try (InputStream in = url.openStream()) { int r; while ((r = in.read()) != -1) { System.out.write(r); } return; } catch (IOException ex) { System.err.println("stop Jetty failed: " + ex.getMessage()); } } Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setPort(PORT); server.addConnector(connector); HandlerCollection handlers = new HandlerCollection(); NCSARequestLog requestLog = new NCSARequestLog(); requestLog.setFilename(home + "/logs/access_" + logFileDateFormat + ".log"); requestLog.setFilenameDateFormat(logFileDateFormat); requestLog.setRetainDays(10); requestLog.setAppend(true); requestLog.setExtended(false); requestLog.setLogCookies(false); requestLog.setLogTimeZone(TimeZone.getDefault().getID()); RequestLogHandler requestLogHandler = new RequestLogHandler(); requestLogHandler.setRequestLog(requestLog); handlers.addHandler(requestLogHandler); // the class YourHandler is the one from your link handlers.addHandler(new YourHandler(server)); server.setHandler(handlers); server.start(); server.join(); } } 
  • java MyJetty启动服务器
  • java MyJetty stop服务器

您可以调用setStopTimeout(long timeout)以相对优雅的方式关闭Jetty。 调用此方法时必须配置statisticsHandler。

引用: Jetty Server.class setStopTimeout(long)

例如

 YourServletHandler servletHandler = new YourServletHandler(); StatisticsHandler statsHandler = new StatisticsHandler(); statsHandler.setHandler(servletHandler); Server server = new Server(80); server.setHandler(statsHandler); server.setStopTimeout(3000L); //... server.start(); //... server.stop(); 

Jetty 7.5.x开始,您可以在代码中使用org.eclipse.jetty.server.handler.ShutdownHandler

 Server server = new Server(8080); HandlerList handlers = new HandlerList(); handlers.setHandlers(new Handler[] { someOtherHandler, new ShutdownHandler("secret_password", false, true) }); server.setHandler(handlers); server.start(); 

…这将允许您通过发出以下http POST请求来关闭您的docker:

 curl -X POST http://localhost:8080/shutdown?token=secret_password