jetty.xml解析


我們知道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的文件最重要的一些內容就配置完了,接下來還有一些其他的配置,一般情況下用默認值就好了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM