tomcat
2020-07-21 09:49:56 8 举报
tomcat启动流程
作者其他创作
大纲/内容
启动host容器
backgroundProcessorDelay 0 engine在实例化的时候将这个值设置为10
protocolHandler是在Connector初始化的时候进行初始化,会根据server.xml中配置的协议生成protocolHandler对象,默认生成Http11NioProtocol对象,创建protocolHandler的时候会创建NioEndpoint对象(主要负责请求的处理)
在容器启动前创建域
filterStart()
器,从commonClassLoader寻找直到找到到系统类加载器,并加载相应路径下的jar包
指定mainclass
initInternal()
ContainerBase.startInternal()
startInternal();
读取配置文件,server.xml
daemon.load(args);
super.initInternal();
adapter = new CoyoteAdapter(this);
所有组件的生命周期实现都是通过LifecycleBase实现engine、connector
解析web.xml
启动servlet容器
start()
创建工作线程池
load(String args[])
创建bootstrap实例
endpoint.start();
调用监听器
调用父类initInternal方法
endpoint.init();
pollers = new Poller[getPollerThreadCount()];
ContextConfig会初始化web应用,这个监听器在解析server.xml的时候创建
init();
startInternal()
为解析出来的监听器添加 LifecycleEvent,并执行listener.lifecycleEvent(event)方法
创建servlet对象
创建解析的digester
Bootstrap bootstrap = new Bootstrap();
child.start();
connector.init();
processServletContainerInitializers();
生命周期交给LifeCycleBase管理
getPipeline().addValve(valve);
解析实现了servlet3.0标签的class
将解析出来的servlet、filter、listener对象赋值给context
Class<?> startupClass = catalinaLoader.loadClass(\"org.apache.catalina.startup.Catalina\");
getRealm();
创建完对象以后会以Catalina对象为root,为成员属性赋值
初始化类加载器
为每一个应用创建一个类加载器
acceptors = new Acceptor[count];
执行监听器事件
StandardEngine.startInternal();
反射调用Catalina对象的load方法
daemon.start();
启动context
daemon = bootstrap;
cl != null && cl != ClassLoader.getSystemClassLoader()
daemon.setAwait(true);
engine.init();【容器】
加载资源
解析实现ServletContainerInitializer接口对象
getServer().init();
初始化mapperListener
StandardServer.initInternal()
调用LifeCycleBase
commonLoader = createClassLoader(\"common\
创建sharedClassLoader
protocolHandler.init();
child.start();
LifecycleBase
ContainerBase
将host放入startStop线程中进行启动
Object startupInstance = startupClass.getConstructor().newInstance();
创建tomcat接收请求的线程
service.init();
创建listener实例,spring通过listener来进进行加载
启动http服务器
Catalina
digester.parse(inputSource);
globalNamingResources.start();
创建filter
创建BootStrap实例
Container children[] = findChildren();
调用ContainerBase
主要初始化处理http请求部分,http服务器
initInternal();
results.add(startStopExecutor.submit(new StartChild(child)));
startAcceptorThreads();
engine.start();
public static void main(String args[])
webConfig();
创建多路复用器
启动host,在启动host之前要对host进行init
创建ContainerBackgroundProcessor线程池,用于tomcat的热加载以及热部署
mapperListener初始化,组织engine下对应的host,host对应的context,以及wrapper
执行main方法
LifeCysleBase.start()
解析server.xml并为相应的成员变量赋值Catalina中的Server赋值,并创建对象
加载Catalina类
创建server.xml的解析类,会把配置文件中的所有类列出来(StandardServer、StandardService.....)
循环server下的service并进行初始化
mapperListener.init();
configure_start处理start事件
bootstrap.init();
启动全局资源
启动endpoint
catalinaDaemon = startupInstance;
创建catalinaloader
会把servlet包装成wrapper对象
mapperListener.start();
调用StandardServer的初始化方法
调用子类重写方法
创建访问超时线程,处理超时请求
初始化业务处理部分
启动各个组件
StandardServer.startInternal();
ContextConfig监听器
初始化connector
创建Catalina对象实例
Digester digester = createStartDigester();
catalina.sh/startup.sh
initClassLoaders();
Bootstrap.class
command.equals(\"start\")处理tomcat启动
调用catalina的start
protocolHandler.setAdapter(adapter);
调用线程的Call方法
查询engine下的所有host对象或者host下的所有context
listenerStart()
service.start();
InputSource contextWebXml = getContextWebXmlSource();
创建StartStop线程池,所所有的host、context、wrapper通过该线程池启动
getServer().start();
创建startStopExecutor线程池
启动service
lifecycleEvent(LifecycleEvent event)
setAwait
WebappLoader webappLoader = new WebappLoader();
Connector.startInternal()
super.startInternal();
engine != null
connector.start();
启动protocolHandler
StandardHost
创建valve并加入pipline
设置实例对象
方法由子类实现
adapter主要负负责将处理完成的request与response转发给servlet
file = configFile();
init()
StandardService.initInternal()
loadOnStartup(findChildren())
mapperListener维护着service、engine、host、context的映射关系
主要负责创建nio模型并绑定端口号
解析web.xml文件
启动context,每个context相当于一个应用
StandardContext
createExecutor();
catalinaLoader = createClassLoader(\"server\
调用父类方法
startStopExecutor线程池
加载catalina-home,catalina-base的lib
configureStart();
protocolHandler.start();
如果Context没有初始化对context进行初始化
configureContext(webXml);
sharedLoader = createClassLoader(\"shared\
0 条评论
下一页