我以類似於here所述的方式嵌入碼頭。當RequestLogHandler
無法打開指定的日誌文件時,它會拋出一個異常,但不幸被org.eclipse.jetty.server.Server
捕獲併吞下(但至少先被記錄)。這意味着我沒有明顯的方式來判斷日誌處理程序是否正確啓動。檢測何時嵌入碼頭無法啓動處理程序
有沒有一種方法可以檢測到處理程序無法啓動?
我以類似於here所述的方式嵌入碼頭。當RequestLogHandler
無法打開指定的日誌文件時,它會拋出一個異常,但不幸被org.eclipse.jetty.server.Server
捕獲併吞下(但至少先被記錄)。這意味着我沒有明顯的方式來判斷日誌處理程序是否正確啓動。檢測何時嵌入碼頭無法啓動處理程序
有沒有一種方法可以檢測到處理程序無法啓動?
此構思基於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
。
我還沒有得到這個工作,但它似乎是目前唯一的解決方案。不幸的是,這是一個黑客(正如我所看到的),當一個處理程序啓動時吞下異常。 – 2010-04-26 07:56:14
如何修改碼頭代碼?您可以在RequestLogHandler中的戰略位置添加一些簡單的println語句,它會向您指示處理程序是否已啓動。
日誌報表,所以我(一個人)能夠告訴處理程序何時無法啓動。問題是這是否可以在代碼中完成。 – 2010-04-21 09:21:00
如果你在這裏沒有得到答案,你可以嘗試寫到用戶列表中:[email protected]來源:http://xircles.codehaus.org/projects/jetty/lists產生 – 2010-04-20 23:37:50