zoukankan      html  css  js  c++  java
  • Tomcat启动过程(一):从BootStrap到EndPonit

    Tomcat版本tomcat6.0.44
    观察catalina.sh文件,启动入口:org.apache.catalina.startup.Bootstrap,
    该类main方法执行下面三个方法
    -------------------------------------------------
    init()         load()        start()
    得到Catalina实例     |                            |
                   |                            |
                   |                            |
                   |                            |
                   |                            |
    catalina.java           |                            |
    -----------------------↓---------------------↓-------------
              load()                    start()  Catalina的load()方法:
                   |                            |      a、调用initDirs和initNaming()做tmp路径和命名的初始化。
                   |                            |      b、调用 createStartDigester();生成Digester对象。Digester类负责进行配置文件的解析。
                   |                            |      c、加载配置文件(server.xml),获取输入流InputStream对象
                   |                            |      d、利用Digester解析配置文件输入流,解析之后,获取配置的root节点表示对象,也就是Server对象。
                   |                            |      e、对上一步生成的server对象进行初始化,调用initialize()启动
    standServer.java    |                            |
    -----------------------↓---------------------↓-------------
                           initialize()                 start()        Server遍历下属的多个Service,调用每一个server的initialize()/start()
                   |                             |
                   |                             |
                   |                             |
                   |                             |
    standService.java   |                             |
    -----------------------↓---------------------↓-------------
            initialize()            start()
                   |                              |
                   |                              |
                   |                              |
                   |                              |
    connector.java       |                              |
    -----------------------↓---------------------↓-------------
            initialize()           container.start()------>容器Engine.start(),先不关注
                   |                  executor.start()------->线程池执行器初始化,该线程做什么用?
                   |                  connector.start()------>遍历所有的下属connector,并分别start(),重点分析
                   |                              |
                   |                              | Connector的initialize()方法:
                   |                              |   a、protocolHander.setAdapter(new CoyoteAdapter(this))
                   |                              |     b、调用protocolHander的init()方法
                   |                              |
                   |                              |
    Http11NioProtocol.java                           |
    -----------------------↓---------------------↓-------------
               init()                        start()
                   |                              |   HTTP1ApiProtocol的init()方法:
                   |                              |     a、ep.sethander(Http11ConnectionHandler)
                   |                              |     b、调用ep的init
    NioEndpoint.java    |                              |
    -----------------------↓---------------------↓-------------
             init()                        start()

    NioEndpoint.init()
    {
      ServerSocketChannel serverSock = ServerSocketChannel.open(); //server通道初始化
      serverSock.socket().bind(addr,backlog); //绑定地址,开始进行监听accecpt事件
      NioSelectorPool selectorPool.open();//选择器池初始化
      ……
    }
    NioEndpoint.start()
    {
      //初始化处理线程池,该线程用来处理数据请求
      executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), 60, TimeUnit.SECONDS,taskqueue, tf);
      //初始化poller后台线程组
      for()
      {
        Thread pollerThread = new Thread(pollers[i], getName() + "-ClientPoller-"+i);
        pollerThread.start();
      }
      //初始化acceptor后台线程组
      for()
      {
        Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i);
        acceptorThread.start();
      }
      ……
    }
  • 相关阅读:
    技嘉Z390 AORUS MASTER+酷睿I9超频5.0GHz教程
    USDT
    Scopus数据库简介
    windows server 2016 安装网卡驱动
    solr配置同义词,停止词,和扩展词库(IK分词器为例)
    Solr 数字字符不能搜索的一个问题
    solr添加中文IK分词器,以及配置自定义词库
    SQL Server表分区(转)
    税改后每月个人所得税逐月增加
    IIS Express总结
  • 原文地址:https://www.cnblogs.com/mingziday/p/5271902.html
Copyright © 2011-2022 走看看