4

我以与此处所述类似的方式嵌入 Jetty 。当RequestLogHandler无法打开指定的日志文件时,它会抛出一个异常,不幸地被捕获org.eclipse.jetty.server.Server并吞下(但至少首先记录)。这意味着我没有明显的方法来判断日志处理程序是否正确启动。

有没有一种方法可以检测处理程序何时无法启动?

4

2 回答 2

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这个目的。

于 2010-04-21T16:40:53.833 回答
0

修改码头代码怎么样?您可以在 RequestLogHandler 的关键位置添加一些简单的 println 语句,这将向您指示处理程序是否已启动。

于 2010-04-21T00:06:57.560 回答