如何优雅地关闭嵌入式码头
How to gracefully shutdown embeded jetty
我有一个应用程序在嵌入式码头服务器上运行。现在我想 start/stop 服务器作为服务。
我使用脚本启动服务器。
java $JAVA_OPTS -DREQ_JAVA_VERSION=$JAVA_VERSION -jar myjetty.jar
主要Class
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();
这将启动服务器。Stopping and/or Restarting an embedded Jetty instance via web call 可用于停止服务器,但是,
如何从脚本中停止服务器?以及我应该做出哪些改变来关闭主 class 中的服务器。
没有用于关闭 Jetty 服务器的预定义解决方案。关闭 Jetty 服务器的唯一有序方法是在 运行 服务器实例上调用方法 stop()
。您必须自己实现调用此方法的方式。
您可以(例如)通过...
- 实现 RMI 服务器线程并从 RMI 客户端调用方法
- 实现 JMX MBean 并从客户端调用该 MBean 上的方法
- 像您发布的 link 中描述的那样实施自定义处理程序
如果您只想找到一种不依赖于其他工具的方法,例如 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 请求来关闭您的码头:
curl -X POST http://localhost:8080/shutdown?token=secret_password
我有一个应用程序在嵌入式码头服务器上运行。现在我想 start/stop 服务器作为服务。 我使用脚本启动服务器。
java $JAVA_OPTS -DREQ_JAVA_VERSION=$JAVA_VERSION -jar myjetty.jar
主要Class
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();
这将启动服务器。Stopping and/or Restarting an embedded Jetty instance via web call 可用于停止服务器,但是, 如何从脚本中停止服务器?以及我应该做出哪些改变来关闭主 class 中的服务器。
没有用于关闭 Jetty 服务器的预定义解决方案。关闭 Jetty 服务器的唯一有序方法是在 运行 服务器实例上调用方法 stop()
。您必须自己实现调用此方法的方式。
您可以(例如)通过...
- 实现 RMI 服务器线程并从 RMI 客户端调用方法
- 实现 JMX MBean 并从客户端调用该 MBean 上的方法
- 像您发布的 link 中描述的那样实施自定义处理程序
如果您只想找到一种不依赖于其他工具的方法,例如 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 请求来关闭您的码头:
curl -X POST http://localhost:8080/shutdown?token=secret_password