最近几天看了一个tomcat相关的专栏,梳理下学到的知识点。
项目结构组件成员
加载器
- common加载器 <Tomcat>/common/*
- catalina加载器 <Tomcat >/server/*
- shared加载器 <Tomcat >/shared/*
- web1加载器 <Tomcat >/webapps/<app>/WEB-INF/*目录
- web2加载器 <Tomcat >/webapps/<app>/WEB-INF/*目录
- shared加载器 <Tomcat >/shared/*
- catalina加载器 <Tomcat >/server/*
refactor主从多线程模型
组件成员:
limitLatch
acceptor 监听端口请求处理连接 (主refactor)
poller 监听channel上的读写事件 从refactor 有的话转给worker处理业务(从refactor)
worker
tomcat的线程池
- 写了一个taskqueue,重写了其
offer
方法,实现了--创建核心线程->创建临时线程->放进队列
。 这个和线程池的--创建核心线程->放进队列 ->创建临时线程
流程不太一样,这样的实现,当核心线程创建完时,会直接创建临时线程去处理,避免了等待,而且还有队列避免请求太多时系统崩溃。因为tomcat主要是处理业务io,是任务密集,不是cpu密集。 - tomcat还有一点和线程池不一样。在线程创建达到最大,队列也达到最大,会执行拒绝策略时,tomcat会加一次重试,重新尝试加入队列中,并发数表大时,可以避免大量失败的处理。
tomcat的一键启动
tomcat提供了一个抽象的生命周期的接口 lifeCycle,定义了init start stop destory addLinstener removeLinsener方法。
组件实现这个接口,层级上级的start方法会调用下级的start,其他的方法一样,实现了链式启动停止。
热加载
tomcat会有一个单独的线程,去调用container的backgroundProcess方法。
这个方法会调用子类的方法,会检查文件发生了改变,就重新加载文件。
网友评论