检测嵌入Jetty时何时无法启动处理程序

时间:2010-04-12 10:09:27

标签: java jetty handler

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

有没有办法让我无法检测处理程序何时无法启动?

2 个答案:

答案 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语句,这些语句将指示处理程序是否已启动。