Jetty源碼分析(一)---jetty的啓動流程

jetty主要組件的類圖

整個 Jetty 的核心是圍繞着 Server 類來構建。
Server 類繼承實現了Handler各Container,關聯了 Connector 。

  1. Container是管理 Mbean的容器。
  2. Connector接受各種http連接請求
  3. Handler 處理請求並作出響應
  4. 使用lifeCycle做生命週期管理
    在這裏插入圖片描述

Jetty 的啓動過程

  1. 通過new,set向Container提交lifeCycle對象
public Server(@Name("threadpool") ThreadPool pool)
{
        _threadPool = pool != null ? pool : new QueuedThreadPool();
        //把_threadPool提交到Container中
        addBean(_threadPool);
 }

public void setConnectors(Connector[] connectors)
{
       Connector[] oldConnectors = getConnectors();
        //向容器中提交新的Connector,移除老的
        updateBeans(oldConnectors, connectors);       
}

public void setHandler(Handler handler)
 {
        Handler old = _handler;
        _handler = handler;
         //向容器中提交新的handler,移除老的
        updateBean(old, _handler, true);
 }

  1. 通過Server的doStart方法,觸發Container各對象的生命週期
//ContainerLifeCycle
 protected void doStart() throws Exception
 {
       //遍歷Container的所有對象
       for (Bean b : _beans)
            {
                //有生命用期的對象拿出來玩
                if (b._bean instanceof LifeCycle)
                {
                    LifeCycle l = (LifeCycle)b._bean;
                    switch (b._managed)
                    {
                        //如果對象已裝載則啓動
                        case MANAGED:
                            if (l.isStopped() || l.isFailed())
                                start(l);
                            break;
                        //自動模式
                        case AUTO:
                            if (l.isStopped())
                            {
                                manage(b);
                                start(l);
                            }
                            else
                            {
                                unmanage(b);
                            }
                            break;

                        default:
                            break;
                    }
                }
            }       
 }
  1. 所有的對象準備好了,最終發佈Connector
//Server
protected void doStart() throws Exception{
    //如果第二步沒有異常
	if (mex.size() == 0)
        {
            for (Connector connector : _connectors)
            {
                try
                {
                    connector.start();
                }
                catch (Throwable e)
                {
                    mex.add(e);
                }
            }
      }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章