我們知道jetty有一種啟動方式是在jetty的根目錄中運行命令行:java -jar start.jar,這個命令會調用apache的XmlConfiguration工具類作為啟動類,這個類會默認讀取/etc/jetty.xml文件,加載jetty啟動所必須的配置。接下來分段研究:
<Configure id="Server" class="org.eclipse.jetty.server.Server">
這段配置是整個配置文件的root元素,它其實是調用org.eclipse.jetty.server類的默認構造函數來創建一個server對象,對應源碼:
public Server(){ this((ThreadPool)null); }
創建了一個空的server,那么接下來就是為這個server設置各種對象及屬性了。繼續看:
<Set name="ThreadPool"> <New class="org.eclipse.jetty.util.thread.QueuedThreadPool"> <Set name="minThreads">100</Set> <Set name="maxThreads">1000</Set> <Set name="SpawnOrShrinkAt">2</Set> </New> </Set>
這段配置是為當前server設置線程池,從xml元素也可以看出來它其實是調用server的SetThreadPool方法:
server.setThreadPool(threadPool);
然后new了一個org.eclipse.jetty.util.thread.QueuedThreadPool對象,並設置它的最小線程數、最大線程數以及最多有多少task可以暫時放到隊列里待會執行,還有其他很多參數具體場景可能需要不同的配置。
再繼續看:
<Call name="addConnector"> <Arg> <New class="org.eclipse.jetty.server.nio.SelectChannelConnector"> <Set name="host"><Property name="jetty.host" /></Set> <Set name="port"><Property name="jetty.port" default="8080"/></Set> <Set name="maxIdleTime">3000</Set> <Set name="Acceptors">2</Set> <Set name="statsOn">false</Set> <Set name="confidentialPort">9043</Set> <Set name="lowResourcesConnections">20000</Set> <Set name="lowResourcesMaxIdleTime">10000</Set> </New> </Arg> </Call>
接下來這一段配置是調用addConnector方法,為當前的server對象添加一個connector,即監聽器,jetty默認情況下創建的就是SelectChannelConnector,也就是所謂的nioConnector,關於bio,nio和nio的區別網上資料很多可自行百度。這個方法傳入了很多參數,host、端口port、連接最大的空閑時間maxIdleTime、創建selector個數Acceptors等等,后面這些參數實際項目配置的都不同,但是都會有一個經驗值。關於SelectChannelConnector的詳細介紹參考這里: http://blog.csdn.net/kobejayandy/article/details/20166215 再繼續看:
<Set name="handler"> <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"> <Set name="handlers"> <Array type="org.eclipse.jetty.server.Handler"> <Item> <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> </Item> <Item> <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/> </Item> </Array> </Set> </New> </Set>
這段配置是去調用server的setHandler方法為當前的server設置handler屬性,這里默認創建的是org.mortbay.jetty.handler.HandlerCollection,接着給這個handlerCollection創建了兩個handler分別是ContextHandlerCollection和DefaultHandler。我們知道當jetty收到一個http請求之后,會調用server來處理這個請求,而server對象是調用內部的handler來處理,所以關鍵還是看HandlerCollection是怎么處理的吧,也就是它的handle方法,源碼:
@Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { if (_handlers!=null && isStarted()) { MultiException mex=null; for (int i=0;i<_handlers.length;i++) { try { _handlers[i].handle(target,baseRequest, request, response); } catch(IOException e) { throw e; } catch(RuntimeException e) { throw e; } catch(Exception e) { if (mex==null) mex=new MultiException(); mex.add(e); } } if (mex!=null) { if (mex.size()==1) throw new ServletException(mex.getThrowable(0)); else throw new ServletException(mex); } } }
代碼其實很簡單,主要是那個for循環遍歷當前collection里所有的handler,依次調用它們的handle方法。所以我們平常項目里有些初始化操作會寫在handler類里邊在jetty啟動的時候就會執行初始化。
好了,到這里整個jetty.xml的文件最重要的一些內容就配置完了,接下來還有一些其他的配置,一般情況下用默認值就好了。
