2010-04-12 58 views
4

我以類似於here所述的方式嵌入碼頭。當RequestLogHandler無法打開指定的日誌文件時,它會拋出一個異常,但不幸被org.eclipse.jetty.server.Server捕獲併吞下(但至少先被記錄)。這意味着我沒有明顯的方式來判斷日誌處理程序是否正確啓動。檢測何時嵌入碼頭無法啓動處理程序

有沒有一種方法可以檢測到處理程序無法啓動?

+0

如果你在這裏沒有得到答案,你可以嘗試寫到用戶列表中:[email protected]來源:http://xircles.codehaus.org/projects/jetty/lists產生 – 2010-04-20 23:37:50

回答

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

我還沒有得到這個工作,但它似乎是目前唯一的解決方案。不幸的是,這是一個黑客(正如我所看到的),當一個處理程序啓動時吞下異常。 – 2010-04-26 07:56:14

0

如何修改碼頭代碼?您可以在RequestLogHandler中的戰略位置添加一些簡單的println語句,它會向您指示處理程序是否已啓動。

+0

日誌報表,所以我(一個人)能夠告訴處理程序何時無法啓動。問題是這是否可以在代碼中完成。 – 2010-04-21 09:21:00