Tomcat 源码阅读前置知识

背景

本来打算写一期介绍tomcat如何打破双亲委派模型的文章,结果发现补充的前置知识有点多,干脆单独成一篇文章好了;后面如果有其他前置知识或者是发现tomcat设计的有趣的地方继续在这里更新 又水一期博客捏

关于双亲委派模型的介绍可以查看JavaGuide

关于如何对tomcat进行debug,由于tomcat是用ant构建的,本机断点debug比较折腾;所以可以使用嵌入版Tomcat构建一个简单的web项目更方便的进行调试。实例

所谓嵌入版Tomcat其实就是SpringBoot锁使用的内嵌http服务器+servlet容器;可以作为一项依赖加入项目中从而在代码中控制Tomcat的启停。

Tomcat相关前置知识

为什么要打破双亲委派?

因为tomcat可以同时运行多个web应用,可能两个应用中都有一个全名为com.ali.dao.User的类,但是他们的内容是不同的,tomcat如果使用传统的双亲委派就一定会导致两个类混掉从而有一个项目不能正常运行。

tomcat 组件

img

tomca组件生命周期管理

tomcat为所有组件的生命周期抽象出了一个接口Lifecycle

关于组件的生命周期相关方法的通用接口。catalina组件可能会实现这个接口(以及他们支持的功能的适当接口)从而提供组件启动和停止的统一机制。

合法的组件状态转移图:

file

任一状态都可转换为FAILED。

略去一些特殊规定……

在状态变化期间发送 LifecycleEvents的逻辑是在触发更改的方法中定义的。

不合法的状态转换不会发出Events

观察者模式

既然涉及到了Events那么一定用到了观察者设计模式
这个观察者模式实现的很经典~

  1. Listener接口,需要订阅事件的组件自行实现这个接口
    public interface LifecycleListener {
    //定义收到事件后的动作
    public void lifecycleEvent(LifecycleEvent event);
    }
  2. LifecycleBase类中维护了一个List<LifecycleListener> lifecycleListeners,用于注册事件接收者(各组件启动时会注册自己)
  3. LifecycleBase中定义了一个带默认实现的fireLifecycleEvent()方法,子类都是调用它来‘发送’事件;
    但事件并没有真的被‘发送’到哪里,只是会用这个事件通知所有liftcycleListeners中的订阅者,让他们执行相应动作。

    protected void fireLifecycleEvent(String type, Object data) {
        LifecycleEvent event = new LifecycleEvent(this, type, data);
        //通知所有订阅者;无论是什么事件都会通知所有订阅者,由订阅者自行判断是否处理该事件
        for (LifecycleListener listener : lifecycleListeners) {
            listener.lifecycleEvent(event);
        }
    }

源码调试

tomcat启动

最开始几天没有什么抓手,所以就从Tomcat的启动开始读源码(是的,又忘记断点调试这个东西了);读了几天收获不大,主要是对生命周期的实现更了解了一些;
这里以StanderServer的启动为例,其他组件大致相同:

  1. NEW->STARTING_PREP
    这一步由LifecycleBase抽象类的start()方法实现,作为final方法其子类也无权重写
    这个方法主要职责是控制状态转换并调用子类重写的startInternal()方法
  2. STARTING_PREP->STARTING
    在子类的startInternal()方法一开始进行转换,代表开始进行启动逻辑
    在这里会进行类似DFS的操作对子容器进行启动(部分异步)

    启动时的栈
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇