Изящно останавливая сервлеты до того, как Jetty закрывает соединения - PullRequest
0 голосов
/ 21 марта 2012

Во встроенном контейнере Jetty у меня есть сервлет, который передает данные клиентам через длительный опрос, и я хотел бы проинформировать клиентов, когда сервер выключается, отправив им сообщение, прежде чем их соединение будет закрыто.Когда клиент получает это сообщение, он должен предупредить пользователя и прекратить делать запросы http.

К сожалению, первое, что делает Jetty при вызове Server.stop (), закрывает все соединители, поэтому сообщение о завершении работыне отправлено.Единственное решение, которое я нашел до сих пор, - это зарегистрировать LifeCycle.Listener на сервере, который вызывается до закрытия соединений.

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

1 Ответ

0 голосов
/ 21 марта 2012

Я думаю, что вы делаете, это единственный способ. Глядя на код Jetty 8.1, вызов stop () вызывает

        try
        {
            if (_state == __STOPPING || _state == __STOPPED)
                return;
            setStopping();
            doStop();
            setStopped();
        }
        catch (Exception e)
        {
            setFailed(e);
            throw e;
        }
        catch (Error e)
        {
            setFailed(e);
            throw e;
        }

setStopping () равно

private void setStopping()
{
    LOG.debug("stopping {}",this);
    _state = __STOPPING;
    for (Listener listener : _listeners)
        listener.lifeCycleStopping(this);
}

Таким образом, зарегистрированный LifeCycle.Listener - это единственное, что действительно вызывается раньше всего.

...