学习tomcat 小记(8)

Host和Engine

1. Host
1)StandardHost类
catalina中org.apache.catalina.core.StandardHost类是Host接口的标准实现。该类继承自the org.apache.catalina.core.ContainerBase类,实现了Host和Deployer接口。
与StandardContext和StandardWrapper类似,StandardHost的构造函数会将basic valve(org.apache.catalina.core.StandardHostValve)添加到其pipeline中。

每当接收到一个http请求,会调用host的invoke方法。在StandardHost类并没有提供invoke方法的实现,因此,它会调用其父类ContainerBase的invoke方法。而会ContainerBase的invoke方法调用StandardHostValve的invoke方法。此外,StandardHostValve的invoke方法会调用StandardHost的map方法来获取一个context处理http请求。

2)StandardHostMapper类

3)StandardHostValve类
org.apache.catalina.core.StandardHostValve类是StandardHost的basic valve。
在tomcat4中,invoke方法通过调用StandardHost的map方法来获取合适的context。
最后,invoke方法调用context的invoke来处理http请求。

2. Engine
1)Engine接口
org.apache.catalina.Engine接口表示了一个engine对象,也就是tomcat整个的servlet引擎。当部署tomcat时要使用多个虚拟机的话,就需要使用engine。事实上,部署的tomcat都会是使用一个engine。

2)StandardEngine类
org.apache.catalina.core.StandardEngine类是Engine接口的标准实现。相比与StandardContext类和StandardHost类,StandardEngine类相对小一些。在实例化的时候,StandardEngine会添加一个basic valve
作为一个顶层container,engine的子container只能是host,所以,若是给它设置以了一个非host的container,会抛出异常。

3)StandardEngineValve类
org.apache.catalina.core.StandardEngineValve类是StandardEngine的basic valve。
在验证了request和response对象的类型后,invoke方法会获取host对象,用来处理请求。

3. Server与Service
1)server
org.apache.catalina.Server接口表示了整个catalina的servlet引擎,囊括了所有的组件。server使用一种优雅的方法来启动/停止整个系统,不需要对connector和container分别启动/关闭。
当启动server时,server会负责启动其所有的组件,然后就等待关闭命令。server使用service来获取组件,如connector和container。

shutdown属性保存了发送给server的关闭命令。port属性保存了server会从哪个端口获取关闭命令。addService方法用于为server添加service,removeService方法则可以删除某个service。initialize方法会在启动之前执行。

2)StandardServer
org.apache.catalina.core.StandardServer类是Server接口的标准实现。其中的shutdown方法是最重要的,用于关闭server。该类中的许多方法用于将server配置信息保存为一个新的server.xml文件。
与StandardServer的生命周期有关的方法有:initialize,start,stop和await。与其他组件类似,initialize用于初始化,start用于启动,然后调用await等待关闭命令,最后,调用stop关闭server。调用await方法后,server会被阻塞,直到总8085端口(或其他端口,自定)收到了关闭命令。当await命令返回后,stop方法会关闭所有的子组件。

3)Service接口
org.apache.catalina.Service接口表示了一个service。一个service可以持有一个container和多个connector,所有的connector都会与这个container相关联。

4)StandardService类
org.apache.catalina.core.StandardService类是Service接口的标准实现。StandardService的initialize方法用于初始化添加到其中的connector。StandardService类还实现Lifecycle接口,因此,它也可以启动connector和container。

connector和container
StandardService对象中有两种组件:connector和container。其中container只有一个,connector可以有多个。多个connector使用tomcat可以多种不同的请求协议。例如,一个处理http请求,一个处理https请求。

4.Bootstrap类
Bootstrap类的main方法会创建一个engine,一个host,一个context,两个wrapper和一个connector。然后,将它们进行关联。但,需要注意的是,connector并没有与顶层container(engine)相关联。相反,main方法创建了一个service对象,和一个server对象,将service添加到server中:
Service service = new StandardService();
    service.setName("Stand-alone Service");
    Server server = new StandardServer();
    server.addService(service);

然后,main方法将connector和engine添加到service中:
service.addConnector(connector);
service.setContainer(engine);

这样,connector就和container关联起来了。然后,main方法调用server的initialize和start方法,初始化connector,并将connector和container启动:
if (server instanceof Lifecycle) {
      try {
        server.initialize();
        ((Lifecycle) server).start();

接下来,main方法调用server的await方法,进入循环等待,监听8085端口。注意,此时connector已经其中,但监听的是另一个端口8080。当await返回时,说明接收到了关闭命令,此时,main方法调用server的stop方法,关闭其所有组件。

Stopper类
Stopper类通过socket向server发送一个关闭命令,从而关闭server。


你可能感兴趣的:(java,tomcat,Engine,host)