面试官:来说说Tomcat的启动过程是什么样子的(下)

简介: 阿粉最近在疯狂的研究各种用的工具里面的源码实现,之前给大家都专门的去扣了一下 JDK 里面自带的exe程序,这次阿粉开始更加无聊,直接开始搞Tomcat。

于是回到了StandardServer自己的init和start方法,

protected void startInternal() throws LifecycleException {
        this.fireLifecycleEvent("configure_start", (Object)null);
        this.setState(LifecycleState.STARTING);
        this.globalNamingResources.start();
        Object var1 = this.servicesLock;
        synchronized(this.servicesLock) {
            for(int i = 0; i < this.services.length; ++i) {
                this.services[i].start();
            }
        }
    }

117.jpg

总得来说就是,StandardServer继承自LifecycleMBeanBase,而LifecycleMBeanBase继承自LifecycleBase,而LifecycleBase类中的模板方法,又让自己的子类去进行具体的实现,但是我们要知道他的Tomcat生命周期中存在这些内容才行。

图中都说了,Server里面有Service,那么一定就有,我们得去找找看,于是阿粉再次去找并且去看它到底是个什么意思,

public void addService(Service service) {
        service.setServer(this);
        Object var2 = this.servicesLock;
        synchronized(this.servicesLock) {
            Service[] results = new Service[this.services.length + 1];
            System.arraycopy(this.services, 0, results, 0, this.services.length);
            results[this.services.length] = service;
            this.services = results;
            if (this.getState().isAvailable()) {
                try {
                    service.start();
                } catch (LifecycleException var6) {
                    ;
                }
            }
            this.support.firePropertyChange("service", (Object)null, service);
        }
    }

位置是在Server的接口中出现了增加和删除Service的方法,Server的init方法和start方法循环去调用每个Service的init方法和start方法。

接下来我们看看Service的具体实现,找到StandardService:

protected void initInternal() throws LifecycleException {
        super.initInternal();
        if (this.engine != null) {
            this.engine.init();
        }
        Executor[] arr$ = this.findExecutors();
        int len$ = arr$.length;
        int len$;
        for(len$ = 0; len$ < len$; ++len$) {
            Executor executor = arr$[len$];
            if (executor instanceof JmxEnabled) {
                ((JmxEnabled)executor).setDomain(this.getDomain());
            }
            executor.init();
        }
        this.mapperListener.init();
        Object var11 = this.connectorsLock;
        synchronized(this.connectorsLock) {
            Connector[] arr$ = this.connectors;
            len$ = arr$.length;
            for(int i$ = 0; i$ < len$; ++i$) {
                Connector connector = arr$[i$];
                try {
                    connector.init();
                } catch (Exception var9) {
                    String message = sm.getString("standardService.connector.initFailed", new Object[]{connector});
                    log.error(message, var9);
                    if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")) {
                        throw new LifecycleException(message);
                    }
                }
            }
        }
    }

而在方法中主要调用Executor,mapperListener,executor的init方法。

connector之前已经有了,而这个mapperListener就是Mapper的监听器,用来坚挺container容器的变化。

118.jpg

文献参考

《深入剖析Tomcat》

《Tomcat架构解析》

《Servlet/JSP深入详解》

相关文章
|
2月前
|
人工智能 前端开发 Java
【Tomcat源码分析】启动过程深度解析 (二)
本文深入探讨了Tomcat启动Web应用的过程,重点解析了其加载ServletContextListener及Servlet的机制。文章从Bootstrap反射调用Catalina的start方法开始,逐步介绍了StandardServer、StandardService、StandardEngine、StandardHost、StandardContext和StandardWrapper的启动流程。每个组件通过Lifecycle接口协调启动,子容器逐层启动,直至整个服务器完全启动。此外,还详细分析了Pipeline及其Valve组件的作用,展示了Tomcat内部组件间的协作机制。
【Tomcat源码分析】启动过程深度解析 (二)
|
6月前
|
设计模式 算法 前端开发
Tomcat的源码剖析, 启动过程你会吗?
基于JMX Tomcat会为每个组件进行注册过程,通过Registry管理起来,而Registry是基于JMX来实现的,因此在看组件的init和start过程实际上就是初始化MBean和触发MBean的start方法,会大量看到形如: Registry.getRegistry(null, null).invoke(mbeans, "init", false); Registry.getRegistry(null, null).invoke(mbeans, "start", false); 这样的代码,这实际上就是通过JMX管理各种组件的行为和生命期。
36 0
|
XML 应用服务中间件 数据格式
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段
105 0
|
前端开发 Java 应用服务中间件
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段二_load加载初始化
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段二_load加载初始化
97 0
|
前端开发 Java 应用服务中间件
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap
103 0
|
网络协议 安全 Java
面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(3)
面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(3)
138 0
面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(3)
|
安全 Java 应用服务中间件
面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(2)
面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(2)
131 0
面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(2)
|
XML 监控 前端开发
面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(1)
面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(1)
142 0
面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(1)
|
存储 XML Java
Tomcat启动过程原理详解
Tomcat启动过程原理详解
107 0
|
Java 应用服务中间件
面试官:既然启动流程不太了解,那你知道Tomcat的生命周期是什么样子的么?
上一次的文章中,阿粉在面试官面前说了对启动流程不太理解,然后和他聊了一会,然后他又提出了你既然不是特别了解启动流程的话,那你对Tomcat的生命周期熟悉么?
面试官:既然启动流程不太了解,那你知道Tomcat的生命周期是什么样子的么?