2010-04-12 3 views
4

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

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

+0

Если вы не получили ответа здесь, попробуйте написать в список пользователей: [email protected] От: http://xircles.codehaus.org/projects/jetty/lists –

ответ

2

Эта идея основана на реализации WebAppContext, где вы можете использовать WebAppContext.getUnavailableException(), чтобы определить, был ли контекст успешно инициализирован.

Просто замените реализацию по умолчанию сервера и контекст с вашим собственным:

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

Я еще не получил этого, но он кажется единственным решением на данный момент. К сожалению, взломать (как я вижу) ошибку, что исключения проглатываются при запуске обработчика. –

0

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

+0

Операторы журнала генерируются, поэтому Я (человек) могу сказать, когда обработчик не может начать. Вопрос в том, можно ли это сделать в коде. –