Tomcat启动部分源代码分析(四) -- 开启容器

本文详细解析了Tomcat启动过程中的关键步骤,包括Bootstrap#start()、Catalina#start()及StandardServer#start()方法的执行流程。通过分析这些核心方法,读者可以了解Tomcat如何初始化组件、启动服务并完成整个启动过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四. 开启容器

最后是Bootstrap#start()方法的内容了,start()方法结束后,Tomcat就启动成功了。

下面来看一下Bootstrap#start()的内容:

Java代码 Tomcat启动部分源代码分析(四) -- 开启容器 - guoyang1982 - 游龙

  1. public void start() throws Exception {   
  2.     if (catalinaDaemon == null)   
  3.         init();   
  4.     // 调用Catalina#start()   
  5.     Method method = catalinaDaemon.getClass().getMethod("start", (Class[]) null);   
  6.     method.invoke(catalinaDaemon, (Object[]) null);   
  7. }  

 

上述的方法调用了Catalina#start()方法,来进一步看一下:

Java代码 Tomcat启动部分源代码分析(四) -- 开启容器 - guoyang1982 - 游龙

  1. public void start() {   
  2.   
  3.     if (server == null) {   
  4.         // server为空,重新载入   
  5.         load();   
  6.     }   
  7.   
  8.     long t1 = System.nanoTime();   
  9.   
  10.     // 开启新的Server   
  11.     if (server instanceof Lifecycle) {   
  12.         try {   
  13.             ((Lifecycle) server).start();   
  14.         } catch (LifecycleException e) {   
  15.             log.error("Catalina.start: ", e);   
  16.         }   
  17.     }   
  18.   
  19.     long t2 = System.nanoTime();   
  20.     if (log.isInfoEnabled())   
  21.         log.info("Server startup in " + ((t2 - t1) / 1000000) + " ms");   
  22.   
  23.     // shutdown hook,不太清楚做什么的   
  24.     try {   
  25.         if (useShutdownHook) {   
  26.             if (shutdownHook == null) {   
  27.                 shutdownHook = new CatalinaShutdownHook();   
  28.             }   
  29.             Runtime.getRuntime().addShutdownHook(shutdownHook);   
  30.         }   
  31.     } catch (Throwable t) {   
  32.     }   
  33.   
  34.     // await,然后关闭   
  35.     if (await) {   
  36.         await();   
  37.         stop();   
  38.     }   
  39.   
  40. }  

 

这个方法的核心就是在Server的开启这一步。还是来看一下StandardServer#start()

Java代码 Tomcat启动部分源代码分析(四) -- 开启容器 - guoyang1982 - 游龙

  1. public void start() throws LifecycleException {   
  2.     if (started) {   
  3.         log.debug(sm.getString("standardServer.start.started"));   
  4.         return;   
  5.     }   
  6.   
  7.     // 通知"BEFORE_START_EVENT"事件   
  8.     lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);   
  9.   
  10.     // 通知"START_EVENT"事件   
  11.     lifecycle.fireLifecycleEvent(START_EVENT, null);   
  12.     started = true;   
  13.   
  14.     // 开启服务   
  15.     synchronized (services) {   
  16.         for (int i = 0; i < services.length; i++) {   
  17.             if (services[i] instanceof Lifecycle)   
  18.                 ((Lifecycle) services[i]).start();   
  19.         }   
  20.     }   
  21.   
  22.     // 通知"AFTER_START_EVENT"事件   
  23.     lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);   
  24.   
  25. }  

 

这段代码非常清晰,先是发送"BEFORE_START_EVENT"事件,然后是"START_EVENT"事件,然后开启各个服务,最后发送"AFTER_START_EVENT"事件

其中StandardService#start()方法的源代码如下:

Java代码 Tomcat启动部分源代码分析(四) -- 开启容器 - guoyang1982 - 游龙

  1. public void start() throws LifecycleException {   
  2.     if (log.isInfoEnabled() && started) {   
  3.         log.info(sm.getString("standardService.start.started"));   
  4.     }   
  5.   
  6.     if (!initialized)   
  7.         init();   
  8.   
  9.     // 通知StandardService下面的监听器"BEFORE_START_EVENT"事件   
  10.     // 这里可以看一下server.xml和Catalina#createStartDigester(),事件监听器在Server和Service下面都有   
  11.     lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);   
  12.     if (log.isInfoEnabled())   
  13.         log.info(sm.getString("standardService.start.name", this.name));   
  14.        
  15.     // 通知"START_EVENT"事件   
  16.     lifecycle.fireLifecycleEvent(START_EVENT, null);   
  17.     started = true;   
  18.   
  19.     // 开启Container(Engine)   
  20.     if (container != null) {   
  21.         synchronized (container) {   
  22.             if (container instanceof Lifecycle) {   
  23.                 ((Lifecycle) container).start();   
  24.             }   
  25.         }   
  26.     }   
  27.        
  28.     // 开启executors   
  29.     synchronized (executors) {   
  30.         for (int i = 0; i < executors.size(); i++) {   
  31.             executors.get(i).start();   
  32.         }   
  33.     }   
  34.   
  35.     // 开启Connectors   
  36.     synchronized (connectors) {   
  37.         for (int i = 0; i < connectors.length; i++) {   
  38.             if (connectors[i] instanceof Lifecycle)   
  39.                 ((Lifecycle) connectors[i]).start();   
  40.         }   
  41.     }   
  42.   
  43.     // 通知"AFTER_START_EVENT"事件   
  44.     lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);   
  45. }  

 

在此方法中可以看到,Tomcat的所有容器,服务等都已经启动完毕了。Tomcat的启动过程正式结束。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值