设为首页 收藏本站
查看: 499|回复: 0

[经验分享] 分享Tomcat源码系列二

[复制链接]

尚未签到

发表于 2017-1-26 08:57:48 | 显示全部楼层 |阅读模式
下面是standardEngine的启动和connector的启动

● standardEngine的启动

(1) 首先是StandardEngine.start()被调用

Java代码

public void start() throws LifecycleException {      
       // Standard container startup        
      //进行logger,manager,cluster,realm,resource的启动        
       super.start();      
}  
(2) super.start()--->org.apache.catalina.core.ContainerBase#start()

Java代码

public synchronized void start() throws LifecycleException {      
//(省略)  server.xml中配置应用组件的启动         
//StandardHost容器的启动,        
        Container children[] = findChildren();        
        for (int i = 0; i < children.length; i++) {        
            if (children instanceof Lifecycle)        
                ((Lifecycle) children).start();        
        }         
   
    //StandardPipeline的启动(容器与容器间的管道)        
        if (pipeline instanceof Lifecycle)        
            ((Lifecycle) pipeline).start();      
}   
(3) StandardHost.start()被调用

Java代码

public synchronized void start() throws LifecycleException {      
//返回到以上的containerBase#start执行pipeline        
      super.start();      
}  
(4) StandardPipeline#start

Java代码

public synchronized void start() throws LifecycleException {      
       // 将会调用HostConfig#start方法        
       lifecycle.fireLifecycleEvent(START_EVENT, null);        
      
       // Notify our interested LifecycleListeners        
       lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);        
}   
(5) HostConfig#start

Java代码

public void start() {      
          //部暑webapps        
          deployApps();                 
  }     
(6) HostConfig#deployApps

Java代码

protected void deployApps() {        
    File appBase = appBase();        
    File configBase = configBase();        
    // Deploy XML descriptors from configBase        
    deployDescriptors(configBase, configBase.list());        
    // Deploy WARs, and loop if additional descriptors are found        
    deployWARs(appBase, appBase.list());        
    // Deploy expanded folders        
    deployDirectories(appBase, appBase.list());                  
}   
(7) deployWARs

Java代码

protected void deployWARs(File appBase, String[] files) {      
……      
deployWAR(contextPath, dir, file);               
  }  
(8) deployWAR

Java代码

protected void deployWAR(String contextPath, File war, String file) {      
if (context instanceof Lifecycle) {        
  // (省略)      
            Class clazz = Class.forName(host.getConfigClass());        
            LifecycleListener listener =        
                (LifecycleListener) clazz.newInstance();        
            ((Lifecycle) context).addLifecycleListener(listener);        
        }        
        context.setPath(contextPath);        
        context.setDocBase(file);        
        //以下这一步跟进去,,StandardContext的启动        
        host.addChild(context);              
  }   
(9) StandardContext#start

在Context的启动过程中,主要完成了以下任务。

----------------------------------------------------------------------------------------------------------------------

a) 设置web app的具体目录webappResources。

b) postWorkDirectory (),创建临时文件目录。Tomcat下面有一个work目录,用来存放临时文件。

c) 触发START_EVENT事件监听,在这个事件监听里面会启动ContextConfig的start()事件,ContextConfig是用来配置web.xml的。

d) 为context创建welcome files,通常是这三个启动文件:index.html、index.htm、index.jsp

e) 配置filter

f) 启动带有的Servlet。

g) 注册JMX。

----------------------------------------------------------------------------------------------------------------------

至此,Container启动完毕,下面是connector的启动。

● connector的启动

(1) org.apache.catalina.connector.Connector.start()

Java代码

public void start() throws LifecycleException {      
           // Http11Protocol的启动      
            protocolHandler.start();      
}   
(2) Http11Protocol#start

Java代码

public void start() throws Exception {      
try {        
            //到了终点的启动        
            endpoint.start();        
        } catch (Exception ex) {        
            log.error(sm.getString("http11protocol.endpoint.starterror"), ex);        
            throw ex;        
        }   
(3) JIoEndPoint#start

Java代码

public void start()        
        throws Exception {                 
                  
            for (int i = 0; i < acceptorThreadCount; i++) {        
        //这里的acceptor是一个线程,里面是一个serversocket的启动        
                Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i);        
                acceptorThread.setPriority(threadPriority);        
                acceptorThread.setDaemon(daemon);        
                acceptorThread.start();        
            }        
        }  
(4) Acceptor#run

Java代码

public void run() {                    
// Accept the next incoming connection from the server socket        
               try {        
          //这里进行了accept(),等待客户端消息,进行接收        
                   Socket socket = serverSocketFactory.acceptSocket(serverSocket);        
                   serverSocketFactory.initSocket(socket);        
                   // Hand this socket off to an appropriate processor        
                   if (!processSocket(socket)) {        
                       // Close socket right away        
                       try {        
                           socket.close();        
                       } catch (IOException e) {        
                           // Ignore        
                       }        
                   }        
               }catch ( IOException x ) {        
                   if ( running ) log.error(sm.getString("endpoint.accept.fail"), x);        
               } catch (Throwable t) {        
                   log.error(sm.getString("endpoint.accept.fail"), t);        
               }        
}   
至此Connector.start方法调用完毕。整个server启动完毕。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-333516-1-1.html 上篇帖子: Tomcat 源码学习 之 Http11ConnectionHandler 下篇帖子: Tomcat搭建WAP开发环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表