我已经挖掘了Jetty文档,试图找出如何正确配置嵌入式Jetty以优雅地关闭,但我发现它缺乏。
the documentation中的示例随后使用setStopAtShutdown(true)
。但是,没有JavaDoc或解释为什么要这样做。据我所知,默认值设置为false。
此外,还有setGracefulShutdown()
方法changed to setStopTimeout()
it seems,但这也没有记录。
所以这些是我的问题:
编辑: 经过一番试验和错误;发现如果你想让Jetty向任何侦听器发出关闭事件,例如Spring的ContextLoaderListener,则需要setStopAtShutdown(true)。
答案 0 :(得分:10)
正常关闭过程请求每个工作线程关闭(即完成处理当前请求,然后不接受任何新请求并退出)。然后等待一点(通过超时可配置),如果有任何线程仍然存在,它会强行杀死它们。这可能发生,因为线程花费很长时间来处理请求,或者因为死锁。如果保留默认值30秒,则应用程序退出可能需要30秒多一点。减少超时值将使您更快地关闭时间,但代价是可能会杀死忙于处理合法,活动请求的线程。
答案 1 :(得分:1)
默认stopAtShutdown
似乎是真的,请参阅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文件(以及其他内容),我使用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()");
}
我知道这不会直接解决您的问题,但也许您可以向我们提供更多信息。