1

我正在使用嵌入式 Jetty 来启动标准的 Java webapp。我的启动器是这样的:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle.Listener;
import org.eclipse.jetty.webapp.WebAppContext;

...

Listener listener = ...;
Server server = new Server(8080);
WebAppContext webapp = new WebAppContext();
...
webapp.addLifeCycleListener(listener);

server.setHandler(webapp);
server.start();
...

这一切都很好,因为我可以启动我的应用程序并浏览它,一切似乎都在工作。

但现在我正在尝试向我的启动器添加错误报告。我暂时将我的 webapp 设置为contextInitialized()ServletContextListener. 抛出异常,我收到一条日志消息

ERROR org.eclipse.jetty.util.log Failed startup of context WebAppContext@...

但我的 LifeCycleListener 没有收到任何失败事件。实际上,它接收到一个启动事件,并且WebAddContext传递给监听器返回 false forLifeCycle#isFailed()和 true for LifeCycle#isRunning()

浏览到我的 webapp 会导致 503 Service Unavailable 错误。

这发生在 Jetty 版本 7.0.1.v20091125 和 7.2.1.v20101111 中。请参阅Jetty 7 api 文档

4

2 回答 2

2

根据我对 Heri 回答的评论,WebAppContext 吞下了异常。否则它们将被 AbstractLifeCycle 捕获并发出失败事件。这让我大部分时间都在那里:

public class ThrowyWebAppContext extends WebAppContext {
    @Override
    protected void doStart() throws Exception {
        super.doStart();
        if (getUnavailableException() != null) {
            throw (Exception) getUnavailableException();
        }
    }
}
于 2010-12-01T23:11:17.150 回答
1

如果我没记错的话,上下文元素的失败生命周期不会传播到上下文本身的生命周期(就像失败的上下文不会传播到服务器本身的生命周期一样)。检查和上下文SecurityHandler的生命周期。ServletHandlerSessionHandler

于 2010-12-01T22:33:52.247 回答