关闭码头 - ShutdownHandler 与 stop()

Shutdown Jetty - ShutdownHandler vs stop()

这里有几个关于在 SO 上关闭 Jetty 的问题,但它们已经有将近 10 年的历史了,并没有完全涵盖我的问题。

我的应用程序中有一个嵌入式 Jetty 服务器,我想从应用程序内部关闭该服务器。 到目前为止,我想出了几种方法来做到这一点:

ShutdownHandler shutdownHandler = new ShutdownHandler("shutdownToken");
server.setHandler(new HandlerList(shutdownHandler));
shutdownHandler.sendShutdown();
server.stop();

这些方法之间有什么区别?我在 Jetty 文档中找不到合适的答案。

ShutdownHandler 允许 HTTP 请求关闭服务器,前提是请求包含正确的 password/token 以启动关闭。

不推荐用于可在 Internet 上公开访问的服务器的解决方案。

server.stop() 是一个很好的解决方案,但您不能从服务器管理的线程中使用该方法。

这就是为什么 ShutdownHandler 安排它在服务器未管理的另一个线程上使用的 server.stop()

推荐设置

  1. 创建一个 password/token 用于关闭
  2. 使用 ShutdownMonitor 在本地主机上侦听关闭命令,此命令有一个必须提供的 password/token 来授权关闭。
  3. 设置 Server.setStopTimeout(long) 以允许服务器组件正常超时。
  4. 在服务器处理程序树上设置 StatisticsHandler(在开始时)以跟踪活动 connections/requests 以便正常关闭以等待活动请求在启动停止之前完成。

当需要关闭服务器时,您现在有 2 个选择。

  1. 向进程发送 SIGHUP 信号
  2. 发送shutdown命令处理

jetty-home 的 start.jar 如何使用此推荐设置

jetty-home 发行版中提供的 bin/jetty.sh 基本上将使用以下命令集。

$ cd /path/to/myjettybase
$ java -jar $JETTY_HOME/start.jar --stop

配置的 ${jetty.base} 将包含了解如何停止服务器所需的各种停止配置(STOP_HOST、STOP_PORT、STOP_KEY、STOP_WAIT ).