您的位置:首页 > 运维架构 > Tomcat

Tomcat启动过程(一):从BootStrap到EndPonit

2016-03-13 14:07 609 查看
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();
  }
  ……
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: