我以与此处所述类似的方式嵌入 Jetty 。当RequestLogHandler
无法打开指定的日志文件时,它会抛出一个异常,不幸地被捕获org.eclipse.jetty.server.Server
并吞下(但至少首先记录)。这意味着我没有明显的方法来判断日志处理程序是否正确启动。
有没有一种方法可以检测处理程序何时无法启动?
这个想法是基于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
这个目的。
修改码头代码怎么样?您可以在 RequestLogHandler 的关键位置添加一些简单的 println 语句,这将向您指示处理程序是否已启动。