• 【Tomcat8源码学习之八】服务器和服务


    Tomcat源码版本:apache-tomcat-8.5.54-src
    JDK源码版本:jdk1.8.0_171

    一、服务器
    1、org.apache.catalina.Server接口
    一个服务器提供了一种优雅的机制来启动和停止整个系统,不必再单独的启动连接器和容器了。当服务器启动的时候,它启动内部的所有组件。然后无限期的等待关闭命令,如果你想要关闭系统,发送一个关闭命令道指定端口即可。当服务器收到正确的关闭指令后,它停止所有组件的服务。

    package org.apache.catalina;
    import java.io.File;
    import org.apache.catalina.deploy.NamingResourcesImpl;
    import org.apache.catalina.startup.Catalina;
    
    public interface Server extends Lifecycle {
        //JNDI服务上下文
        public NamingResourcesImpl getGlobalNamingResources();
        public void setGlobalNamingResources(NamingResourcesImpl globalNamingResources);
        public javax.naming.Context getGlobalNamingContext();
        //等待关闭命令的端口
        public int getPort();
        public void setPort(int port);
        //等待关闭命令的地址
        public String getAddress();
        public void setAddress(String address);
        //获取关闭指令字符串
        public String getShutdown();
        public void setShutdown(String shutdown);
        //父类加载器
        public ClassLoader getParentClassLoader();
        public void setParentClassLoader(ClassLoader parent);
        //持有的Catalina
        public Catalina getCatalina();
        public void setCatalina(Catalina catalina);
        //持有的容器base
        public File getCatalinaBase();
        public void setCatalinaBase(File catalinaBase);
        //Catalina目录
        public File getCatalinaHome();
        public void setCatalinaHome(File catalinaHome);
        //一个服务器可以有零个或多个服务 下面是管理org.apache.catalina.Service服务组件的方法
        public void addService(Service service);
        public Service findService(String name);
        public Service[] findServices();
        public void removeService(Service service);
        
        public Object getNamingToken();
        public void await();
    }

    2、org.apache.catalina.core.StandardServer 标准实现
    有四个跟生命周期相关的方法:

    (1)initInternal:初始化Server组件及其Service子组件:初始化要添加到服务器实例上的服务;
    (2)startInternal:启动Server组件及其Service子组件;
    (3)stopInternal:停止Server组件及其Service子组件;
    (4)destroyInternal:销毁Server组件及其Service子组件;
    (5)await:在8085端口创建一个ServerSocket对象,在 while 循环调用它的accept 方法。Accept 方法仅仅接受 8085 端口的信息。它将接受到的信息跟shutdown 命令进行匹配,如果匹配的话跳出循环关闭 SocketServer,如果不匹配继续 while 循环等待另一个命令。

    二、服务
    服务器还使用了另外一个组件,服务,它用来持有组件,例如容器或者一个多个的连接器。
    1、org.apache.catalina.Service接口
    一个服务可以可以有一个容器和多个连接器。你可以添加多个连接器 ,并将它们跟容器相关联

    package org.apache.catalina;
    import org.apache.catalina.connector.Connector;
    import org.apache.catalina.mapper.Mapper;
    public interface Service extends Lifecycle {
        //设置唯一的一个Engine容器
        public Engine getContainer();
        public void setContainer(Engine engine);
    
        //Service名称
        public String getName();
        public void setName(String name);
    
        //操作关联的Server
        public Server getServer();
        public void setServer(Server server);
    
        public ClassLoader getParentClassLoader();
        public void setParentClassLoader(ClassLoader parent);
    
        //容器注册的域
        public String getDomain();
    
        //操作多个连接器
        public void addConnector(Connector connector);
        public Connector[] findConnectors();
        public void removeConnector(Connector connector);
    
        //服务关联的线程池
        public void addExecutor(Executor ex);
        public Executor[] findExecutors();
        public Executor getExecutor(String name);
        public void removeExecutor(Executor ex);
    
        //服务关联的映射器
        Mapper getMapper();
    }

    2、org.apache.catalina.core.StandardService 标准实现
    一个 StandardService 实例包括两种组件:一个容器和多个连接器。
    多个连接器可以使得 Tomcat 能服务于多个协议。包括HTTP协议请求、HTTPS协议请求、AJP协议请求。
    有四个跟生命周期相关的方法:
    (1)initInternal:初始化Service组件及其子组件:初始化要添加到服务实例上的容器和连接器;
    (2)startInternal:启动Service组件及其子组件;
    (3)stopInternal:停止Service组件及其子组件;
    (4)destroyInternal:销毁Server组件及其Service子组件;

    总结:

    1个Catalina包含1个Server;
    1个Server包含多个Service;
    每个Service对应有下面的组件:
        1个Engine;
        多个Connector;
        一个MapperListene;
  • 相关阅读:
    LENGTH()和CHAR_LENGTH()区别
    使用ibatis时 sql中 in 的参数赋值(转)
    数据库类型空间效率探索(五)- decimal/float/double/varchar
    MySQL用命令行复制表的方法
    升讯威微信营销系统开发实践:微信接口的 .NET 封装
    Github开源:Sheng.RabbitMQ.CommandExecuter (RabbitMQ 的命令模式实现)
    开源 & 免费使用 & 打包下载自行部署 :升讯威 周报系统
    开源 & 免费使用 & 打包下载自行部署 :升讯威 周报系统
    GitHub开源:升讯威ADO.NET增强组件 sheng.ADO.NET.Plus V1.3
    [源代码] SailingEase .NET Resources Tool (.NET 多语言资源编辑器)
  • 原文地址:https://www.cnblogs.com/cac2020/p/12781347.html
Copyright © 2020-2023  润新知