我以与here描述的方式类似的方式嵌入Jetty。当RequestLogHandler
无法打开指定的日志文件时,它会抛出一个异常,这个异常很可能被org.eclipse.jetty.server.Server
捕获并吞没(但至少先记录)。这意味着我没有明显的方法来判断日志处理程序是否正确启动。
有没有办法让我无法检测处理程序何时无法启动?
答案 0 :(得分:2)
这个想法基于WebAppContext的实现,您可以使用WebAppContext.getUnavailableException()来确定上下文是否已成功初始化。
只需用您自己的:
替换Server和Context的默认实现public static class MyContext extends Context {
private Exception _exception;
@Override
protected void doStart() throws Exception {
try {
super.doStart();
} catch (final Exception e) {
_exception = e;
}
}
@Override
protected void doStop() throws Exception {
try {
super.doStop();
} finally {
_exception = null;
}
}
public Exception getException() {
return _exception;
}
}
public static class MyServer extends Server implements InitializingBean {
public void afterPropertiesSet() throws Exception {
start();
for (final Handler h : getHandlers()) {
if (h instanceof MyContext) {
final MyContext c = (MyContext) h;
if (c.getException() != null) {
throw new RuntimeException("failed to init context " + c.getDisplayName(),
c.getException());
}
}
}
}
}
在您的beans.xml中,只需使用您自己的实现替换org.mortbay.jetty.Server
(并删除init-method="start"
)和org.mortbay.jetty.servlet.Context
。
此代码适用于Jetty 6(就像您链接的示例一样),因为这就是我所拥有的。我没有测试它,但它与我们成功使用WebAppContext几乎相同。为了将其扩展到RequestLogHandler,您可以对正在使用的任何处理程序执行相同操作,也可以创建装饰器来包装任何处理程序。您可能希望为此目的查看org.mortbay.jetty.handler.HandlerWrapper
。
答案 1 :(得分:0)
如何修改码头代码?您可以在RequestLogHandler的战略位置添加一些简单的println语句,这些语句将指示处理程序是否已启动。