嵌入式码头和正常关机

2022-09-03 14:48:31

我挖掘了Jetty文档,试图找出如何正确配置嵌入式Jetty以优雅地关闭,但我发现它缺乏。

文档中的示例不连续地使用 。但是,没有JavaDoc或解释为什么应该这样做。据我所知,默认值设置为 false。setStopAtShutdown(true)

此外,该方法似乎已更改为setStopTimeout(),但这也没有记录。setGracefulShutdown()

这些是我的问题:

  1. 为什么要设置或不设置关机时停止?
  2. 何时会覆盖停止超时(默认为 30 秒)?
  3. 在将 Jetty 配置为正常关闭时,还应考虑哪些其他事项?

编辑:经过一些试验和错误;发现 setStopAtShutdown(true) 是必需的,如果你想让 Jetty 向任何侦听器发出关闭事件的信号,比如 Spring 的 ContextLoaderListener。


答案 1

正常关闭过程请求每个工作线程关闭(即完成对当前请求的处理,然后不接受任何新请求并退出)。然后,它会等待一段时间(可通过超时进行配置),如果有任何线程仍然存在,它会强制杀死它们。例如,发生这种情况可能是因为线程需要很长时间来处理请求,或者因为死锁。如果保留默认值 30 秒,则应用程序可能需要 30 秒多一点的时间才能退出。降低超时值将为您提供更快的关机时间,但代价是可能会杀死忙于处理合法活动请求的线程。


答案 2

默认值似乎为 true,请参阅 http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-server/src/main/config/etc/jetty.xml?h=jetty-9.1.x,超时也存在,5 秒:stopAtShutdown

<Set name="stopAtShutdown">true</Set>
<Set name="stopTimeout">5000</Set>

此外,您可以为更具体的情况配置LifeCycle.Listener,例如,在关闭服务器时,我使用一个来删除pid文件(以及其他事项),我在ServerConnector上使用addLifeCycleListener在连接器中附加侦听器,在jetty xml中,它看起来像:

<Configure id="Server" class="org.eclipse.jetty.server.Server">
  ...
  <Call name="addConnector">
    <Arg>
      <New class="org.eclipse.jetty.server.ServerConnector">
        ...
        <Call name="addLifeCycleListener">
          <Arg>
            <New class="com.acme.jetty.ConnectorListener"/>
          </Arg>
        </Call>

和 ConnectorListener.java将以如下方式开头:

package com.acme.jetty;

import org.eclipse.jetty.util.component.LifeCycle;

import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;

public class ConnectorListener implements LifeCycle.Listener {
    private static final Logger LOG = Log.getLogger(ConnectorListener.class);
    ...
    public void lifeCycleStopped(LifeCycle event) {
        LOG.debug("lifeCycleStopped()");
    }

我知道这并不能直接解决您的问题,但也许您可以向我们提供更多信息。


推荐