我正在使用嵌入式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。
答案 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)
如果我没记错,上下文元素的生命周期就不会传播到上下文本身的生命周期(就像失败的上下文不会传播到服务器本身的生命周期一样)。检查上下文的SecurityHandler
,ServletHandler
和SessionHandler
的生命周期。