2010-12-01 56 views
1

我使用嵌入式码头推出一个标准的Java Web应用程序。我的启动是这样的:的webapp启动失败,但码头的LifeCycle索赔“开始”

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(); 
... 

这一切工作,即极细的我就可以开始我的应用程序和浏览它,一切都似乎是工作。

但现在我想错误报告添加到我的启动程序。我已经暂时设置我的web应用程序在ServletContextListenercontextInitialized()方法中抛出异常。该异常被抛出,而我得到的

ERROR org.eclipse.jetty.util.log Failed startup of context [email protected] 

日志消息,但我LifeCycleListener不receieve任何故障事件。实际上,它收到一个已启动的事件,并且传递给听众的WebAddContextLifeCycle#isFailed()返回false,对于LifeCycle#isRunning()则返回true。

浏览到503服务不可用错误我webapp的结果。

这发生在码头版本7.0.1.v20091125和7.2.1.v20101111。见Jetty 7 api docs

回答

2

按我的意见和日的答案,燕子WebAppContext例外。否则他们将被AbstractLifeCycle和失败事件发送出去。这让我大部分的方式:

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

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

+0

我试着将听众附加到所有这些没有运气。我正在查看[WebAppContext的源代码](http://download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/webapp/WebAppContext.html#483)。这Log.warn匹配我看到的日志消息(除了我在错误级别看到它)。如果我正在阅读这个权利,那么错误就完全被吞噬了。 [AbstractLifeCycle]中的相关部分(http://download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/util/component/AbstractLifeCycle.html#46)会在引发异常时设置失败子类`doStart()`。 – Patrick 2010-12-01 22:57:18