Встроенный причал и изящное закрытие

Я прорыл документацию Jetty, пытаясь выяснить, как правильно настроить встроенный Jetty, чтобы закрыть его изящно, но мне не хватало его.

В примерах документации используйте setStopAtShutdown (true). Однако JavaDoc не объясняет, почему это нужно сделать. Насколько я могу судить, значение по умолчанию равно false.

Кроме того, метод setGracefulShutdown изменился на setStopTimeout(), кажется,, но это также не документировано.

Итак, это мои вопросы:

  • Зачем вам устанавливать или не устанавливать останов при завершении работы?
  • Когда вы переопределите тайм-аут останова (по умолчанию - 30 секунд)?
  • Что еще нужно учитывать при настройке Jetty для изящного отключения?

Изменить: После некоторых проб и ошибок; обнаружил, что setStopAtShutdown (true) требуется, если вы хотите, чтобы сигнал Jetty выходил из строя любому слушателю, например Spring ContextLoaderListener.

Ответы

Ответ 1

Грациозная процедура выключения запрашивает каждый рабочий поток для закрытия (то есть завершает обработку текущего запроса, а затем не принимает никаких новых запросов и не выходит). Затем он ждет немного (настраивается через таймаут), и если какие-либо потоки остаются, он убивает их принудительно. Это может произойти, потому что поток занимает много времени для обработки запроса, например, или из-за тупика. Если вы сохраняете значение по умолчанию 30 секунд, для выхода приложения может потребоваться чуть больше 30 секунд. Уменьшение значения тайм-аута даст вам более быстрое время выключения, но за счет потенциально убивающих потоков, которые были заняты обработкой законных активных запросов.

Ответ 2

Значение по умолчанию stopAtShutdown похоже на 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 секунд:

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

Кроме того, вы можете настроить LifeCycle.Listener для более конкретных случаев, например, я использую один для удаления pid файла (между прочим) при выключении сервера, я присоединяю прослушиватель в Connector, используя addLifeCycleListener на ServerConnector, в 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()");
    }

Я знаю, что это не касается ваших вопросов напрямую, но, возможно, вы могли бы предоставить нам больше информации.