Java 如何优雅地关闭嵌入式码头
我有一个在嵌入式jetty服务器上运行的应用程序。现在,我想作为服务启动/停止服务器。 我使用脚本启动服务器Java 如何优雅地关闭嵌入式码头,java,jetty,embedded-jetty,Java,Jetty,Embedded Jetty,我有一个在嵌入式jetty服务器上运行的应用程序。现在,我想作为服务启动/停止服务器。 我使用脚本启动服务器 java $JAVA_OPTS -DREQ_JAVA_VERSION=$JAVA_VERSION -jar myjetty.jar 主类 Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setPort(PORT); serve
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();
这将启动服务器。可用于停止服务器,但,
如何从脚本中停止服务器?我应该做些什么改变来关闭主类中的服务器 没有关闭Jetty服务器的预定义解决方案。关闭Jetty服务器的唯一有序方法是在正在运行的服务器实例上调用方法
stop()
。您必须自己实现该方法的调用方式
你可以通过以下方式(例如)实现这一点
- 实现RMI服务器线程并从RMI客户端调用该方法
- 实现JMX MBean并从客户端调用该MBean上的方法
- 实现自定义处理程序,如您发布的链接中所述
curl
)的方法,那么您可以解决它,例如,如下所示(这是您自己的代码,只需稍加修改)
- 使用java MyJetty启动服务器
- 使用
java MyJetty stop
由于Jetty 7.5.x您可以在代码中使用
org.eclipse.Jetty.server.handler.ShutdownHandler
:
Server服务器=新服务器(8080);
HandlerList handlers=new HandlerList();
setHandlers(新处理程序[]
{someOtherHandler,new ShutdownHandler(“secret_password”,false,true)});
setHandler(处理程序);
server.start();
。。。这将允许您通过发出以下http POST请求关闭jetty:
curl-X POSThttp://localhost:8080/shutdown?token=secret_password
您想什么时候关闭服务器?您正在查找server.stop()
?您将如何以及何时触发关机?像服务sudo服务myjetty start
启动服务器和sudo服务myjetty stop
基本上是服务器。stop()这是我应该做的。但是我怎么能调用它呢?@SubOptimal我应该将jetty停止为shutdown.sh在tomcat中做什么?为什么你不能使用你发布的链接curl-v中的解决方案http://localhost:9103/stop
?检查jetty主类中的停止方法@乔斯:如果你喜欢,就戴上戒指;)我认为这是最好的答案。我只建议将ShutdownHandler作为处理程序列表中的第一个处理程序,以便在链中首先考虑它。例如,如果您首先配置了一个ServletHandler,这可以防止关闭。
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();
}
}
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();