Webapp启动失败但Jetty LifeCycle宣称“已启动”

时间:2010-12-01 21:29:37

标签: java web-applications jetty embedded-jetty

我正在使用嵌入式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()的{​​{1}}方法中抛出异常。抛出异常,我收到

的日志消息
ServletContextListener

但是我的LifeCycleListener没有收到任何失败事件。实际上,它接收一个已启动的事件,传递给侦听器的ERROR org.eclipse.jetty.util.log Failed startup of context WebAppContext@... WebAddContext返回false,对LifeCycle#isFailed()返回true。

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

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

2 个答案:

答案 0 :(得分:2)

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

public class ThrowyWebAppContext extends WebAppContext {
    @Override
    protected void doStart() throws Exception {
        super.doStart();
        if (getUnavailableException() != null) {
            throw (Exception) getUnavailableException();
        }
    }
}

答案 1 :(得分:1)

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