【问题标题】:Gracefully stopping servlets before Jetty closes connections在 Jetty 关闭连接之前优雅地停止 servlet
【发布时间】:2012-04-05 23:20:57
【问题描述】:
在嵌入式 Jetty 容器中,我有一个 servlet,它通过长轮询将数据推送到客户端,我想在服务器关闭时通知客户端,方法是在连接关闭之前向他们发送消息。当客户端收到此消息时,它应该警告用户并停止发出 http 请求。
不幸的是,当调用 Server.stop() 时,Jetty 所做的第一件事就是关闭所有连接器,因此不会发送关闭消息。到目前为止我找到的唯一解决方案是在服务器上注册一个 LifeCycle.Listener,它会在连接关闭之前被回调。
有没有更好的方法来实现这一点?我希望 servlet 在连接关闭之前通过即将关闭的服务器的回调得到通知。
【问题讨论】:
标签:
servlets
jetty
long-polling
embedded-jetty
【解决方案1】:
我猜你做的是唯一的方法。查看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 是唯一真正被调用的东西。