首页 > 代码库 > tomcat7源码server

tomcat7源码server

tomcat的server组件由StanderServer实现,它实现了Server接口。

StanderServer的代码量很少,但这里并不能单单来讲StanderServer。tomcat的各个组件都实现了表示生命周期的接口Lifecycle,

但是各个组件并不是直接实现了该接口,而是继承了实现该接口的抽象类。tomcat在设计各个组件时采用了模板模式和观察者模式。

所以看StanderServer还要结合他的父类和接口来看。


Lifecycle定义了生命周期的方法和添加观察者的方法。(在每个生命周期相关的方法被调用的时候都会触发相应的事件,观察者会

监听这些事件)


LifecycleBase是一个实现了Lifecycle的抽象类,在该类中定义了两个成员变量lifecycle(LifecycleSupport)和state(LifecycleState)。

lifecycle(LifecycleSupport)是一个负责事件监听的代理类,它里面定义了一个监听者的数组,保存了所有standerServer上的监听者,

并负责在事件触发是通知这些监听者。state(LifecycleState)是个表示生命周期状态的枚举类。


来看看LifecycleBase里的模板模式。

LifecycleBase实现了Lifecycle接口里的所有生命周期相关的方法

destroy()
init()
start()
stop()
有人想这些生命周期的方法不是应该由具体的子类来实现吗?这里LifecycleBase采用了模板模式,它在生命周期的方法中做了些通用的操作

比如下面的init方法的源码:

@Override
    public final synchronized void init() throws LifecycleException {
        if (!state.equals(LifecycleState.NEW)) {
            invalidTransition(Lifecycle.BEFORE_INIT_EVENT);
        }
        //将状态跟新为正在初始化
        setStateInternal(LifecycleState.INITIALIZING, null, false);

        try {
            initInternal();
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            setStateInternal(LifecycleState.FAILED, null, false);
            throw new LifecycleException(
                    sm.getString("lifecycleBase.initFail",toString()), t);
        }

        //初始化完成
        setStateInternal(LifecycleState.INITIALIZED, null, false);
    }
    
    //抽象方法由子类来实现
    protected abstract void initInternal() throws LifecycleException;

几乎所有实现生命周期接口的子类都会要有更新状态这个操作,所以这里将这些状态操作放在了抽象类里。而具体的方法由子类去实现抽象方法来

 处理。每个生命周期方法都会调用一个对应的抽象方法:


 destroyInternal()
 initInternal()
 startInternal()
 stopInternal()

另外LifecycleBase还实现了添加监听者的方法。将添加的监听者保存在了上面所说的监听者代理类LifecycleSupport中。

这就是LifecycleBase的主要功能。


再来看看LifecycleMBeanBase的作用是实现Mbean的注册,它实现了MBeanRegistration接口,该接口定义了如下方法:

postDeregister()
postRegister(Boolean)
preDeregister()
preRegister(MBeanServer, ObjectName)

MBeanServer的获取和MBean的注册都封装在了Registry类中。

LifecycleMBeanBase实现了父类的initInternal()方法,在该方法中将自己注册到了MbeanServer中:

@Override
    protected void initInternal() throws LifecycleException {
        
        // If oname is not null then registration has already happened via
        // preRegister().
        if (oname == null) {
            mserver = Registry.getRegistry(null, null).getMBeanServer();
            
            oname = register(this, getObjectNameKeyProperties());
        }
    }

这就是LifecycleMBeanBase的主要作用。


最后看看StandardServer的实现。

StandardServer除了拥有父类的一些功能外。还拥有三个成员变量globalNamingResources,services

StandardServer负责初始化和启动它们。globalNamingResources通过JNDI技术保存了数据源对象,在上文Catalina的分析中可知道

globalNamingResources是在解析xml的时候被赋值的。services作为连接Connector和Container(engin)的容器。另外StandardServer还有个成员变量

support(PropertyChangeSupport)监听者代理类,在修改了一些属性(services,globalNamingResources)会触发一些事件。

另外还值得提的是await()方法,Catalina初始化并启动StanderServer后会调用StanderServer的await()方法,让它一直监听server.xml

中<Server port="8005" shutdown="SHUTDOWN">配置的端口,如果这个端口一直没有数据发送过来,StanderServer所在的线程会一直运行下去。


tomcat7源码server