博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tomcat启动过程(一):从BootStrap到EndPonit
阅读量:5117 次
发布时间:2019-06-13

本文共 2548 字,大约阅读时间需要 8 分钟。

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();  }  ……}

 

转载于:https://www.cnblogs.com/mingziday/p/5271902.html

你可能感兴趣的文章
《那些年啊,那些事——一个程序员的奋斗史》开始预售了~~!
查看>>
sql 大写
查看>>
MyBatis-resultType 与 resultMap 中的几种返回类型
查看>>
Ubuntu16.04LTS中使用 apt-get install 出现错误 Could not get lock /var/lib/dpkg/lock 的解决方案...
查看>>
关于mongodb的aggregate
查看>>
Java创建线程的两个方法
查看>>
bootstrap 栅格系统 自动隐藏
查看>>
jps命令使用
查看>>
七、Springmvc拦截器
查看>>
FineUI下实现Enter键搜索功能
查看>>
JDownload: 一款可以从网络上下载文件的小程序第四篇(整体架构描述)
查看>>
mysql优化(一)
查看>>
resttemplate.postforobject
查看>>
python自动发送邮件
查看>>
shiro安全框架
查看>>
kafka简介及集群部署
查看>>
Mysql 安装时Mariadb冲突问题
查看>>
java IO流 之 字符流
查看>>
centos7安装nodejs
查看>>
笔记一 air android开发简介
查看>>