前面的文章分析了在tomcat中的container与pipeline的设计。。。我们知道Server是Service对象的容器,
而Service可以有多个connector对象,但是只能有一个container(一般就是engine对象)对象。。
所以分析各个不同的container对象的入口就在于service对象。。。而在tomcat中一般都是用StandardService这个类型。。。
先来看看一个初略的继承结构吧:
这里其实StandardService算是比较简单的了,首先它继承了LifecycleMBeanBase,这说明这个对象在启动之后将会被注册到JMX上去。。。同时它实现了service接口。。。这里就先来看看这个接口的定义吧:
package org.apache.catalina;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.mapper.Mapper;
public interface Service extends Lifecycle {
public Container getContainer(); //获取拥有的container,service对象只拥有一个container
public void setContainer(Container container); //设置拥有的container
public String getName(); //service的名字
public void setName(String name);
public Server getServer(); //返回所属的server对象
public void setServer(Server server);
public ClassLoader getParentClassLoader(); //获取parentClassLoader
public void setParentClassLoader(ClassLoader parent);
public String getDomain(); //在jmx注册在哪个domain下面
public void addConnector(Connector connector); //添加一个connector
public Connector[] findConnectors(); //返回所有的connector
public void removeConnector(Connector connector); // 移除一个connecter
public void addExecutor(Executor ex); //添加一个executor
public Executor[] findExecutors(); //返回所有的executor
public Executor getExecutor(String name); //根据名字获取executor
public void removeExecutor(Executor ex); //移除一个executor
Mapper getMapper(); //用于请求的map
}
上面接口的定义其实也还挺简单的,无非首先拥有的container对象的管理,另外这里会管理容纳多个connector对象,同时还有executor对象,在以前分析connector部分的时候,我们知道在connector的创建的时候可以指定executor对象,这里指定的executor就是定义在servie对象里面的,当然如果没有指定的话,那么将会创建默认的executor、。、、、
同时这里还有一个非常重要的值得注意的东西,那就是mapper,他将会具体的负责请求的路由。。。
好啦,那么接下来来看看StandardService类型的属性的定义吧:
private String name = null;
private static final StringManager sm =
StringManager.getManager(Constants.Package);
private Server server = null; //所属的server对象
protected final PropertyChangeSupport support = new PropertyChangeSupport(this); //用于支持监听属性的修改
protected Connector connectors[] = new Connector[0]; //connector的数组
private final Object connectorsLock = new Object(); //当修改connector时候用到的锁
protected final ArrayList<Executor> executors = new ArrayList<>(); //所有定义的executor,connector可以用这个里面定义的executor
protected Container container = null; //关联的container
private ClassLoader parentClassLoader = null; //classLoader
protected final Mapper mapper = new Mapper(); //用于请求的map,host的map,warpper,context的map啥的
这里具体每个属性是干嘛用的注释应该说的蛮清楚的吧。。。接下来来看看StandardService启动吧:
//启动
protected void startInternal() throws LifecycleExc