Обнаружение, когда обработчик не может быть запущен при встраивании Jetty - PullRequest
4 голосов
/ 12 апреля 2010

Я встраиваю Jetty аналогично тому, как описано здесь . Когда RequestLogHandler не может открыть указанный файл журнала, он генерирует исключение, которое, к сожалению, перехватывается org.eclipse.jetty.server.Server и проглатывается (но регистрируется первым, по крайней мере) Это означает, что у меня нет очевидного способа определить, правильно ли запущен обработчик журнала.

Есть ли способ, который мне не хватает, чтобы определить, когда обработчик не может запуститься?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

Эта идея основана на реализации 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 для этой цели.

0 голосов
/ 21 апреля 2010

Как насчет изменения кода причала? Вы можете добавить несколько простых операторов println в стратегических местах в RequestLogHandler, которые будут указывать вам, запущен ли обработчик.

...