标签:tomcat源码
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)
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()); } }
最后看看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所在的线程会一直运行下去。
标签:tomcat源码
原文地址:http://blog.csdn.net/ilovezhangxian/article/details/40895463