在Jetty关闭连接之前优雅地停止servlet

时间:2012-03-21 12:29:56

标签: servlets jetty long-polling embedded-jetty

在嵌入式Jetty容器中,我有一个servlet,它通过长轮询将数据推送到客户端,我想通过在关闭服务器之前向客户端发送消息来通知客户端。当客户端收到此消息时,它应该警告用户并停止发出http请求。

不幸的是,Jetty在调用Server.stop()时所做的第一件事是关闭所有连接器,因此不会发送关闭消息。到目前为止,我发现的唯一解决方案是在服务器上注册一个LifeCycle.Listener,在连接关闭之前调用它。

有没有更好的方法来实现这一目标?我希望在关闭连接之前,通过即将关闭服务器的回调通知servlet。

1 个答案:

答案 0 :(得分:0)

我猜你做的是唯一的方法。查看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是唯一真正调用过的东西。