• tomcat源码阅读_代码篇6


    StandardService类

    该类是Service 接口的标准实现,另外还是先lifecycle接口和MBeanRegistration 接口。该类签名如下:

    public class StandardService
            implements Lifecycle, Service, MBeanRegistration

    Service接口是一个或多个连接(Connector)共享一个容器,这样就允许一个SSL连接和一个非SSL连接共享同一个应用程序。

    一个JVM可以有多个Service实例。

    该接口的主要方法有:

    Method Summary
    void addConnector(Connector connector)
               Add a new Connector to the set of defined Connectors, and associate it with this Service's Container.
    Connector[] findConnectors()
               Find and return the set of Connectors associated with this Service.
    Container getContainer()
               Return the Container that handles requests for all Connectors associated with this Service.
    java.lang.String getInfo()
               Return descriptive information about this Service implementation and the corresponding version number, in the format <description>/<version>.
    java.lang.String getName()
               Return the name of this Service.
    Server getServer()
               Return the Server with which we are associated (if any).
    void initialize()
               Invoke a pre-startup initialization.
    void removeConnector(Connector connector)
               Remove the specified Connector from the set associated from this Service.
    void setContainer(Container container)
               Set the Container that handles requests for all Connectors associated with this Service.
    void setName(java.lang.String name)
               Set the name of this Service.
    void setServer(Server server)
               Set the Server with which we are associated (if any).

    原removeConnector方法:

            synchronized (connectors) {
                int j = -1;
                for (int i = 0; i < connectors.length; i++) {
                    if (connector == connectors[i]) {
                        j = i;
                        break;
                    }
                }
                if (j < 0)
                    return;
                if (started && (connectors[j] instanceof Lifecycle)) {
                    try {
                        ((Lifecycle) connectors[j]).stop();
                    } catch (LifecycleException e) {
                        log.error("Connector.stop", e);
                    }
                }
                connectors[j].setContainer(null);
                connector.setService(null);
                int k = 0;
                Connector results[] = new Connector[connectors.length - 1];
                for (int i = 0; i < connectors.length; i++) {
                    if (i != j)
                        results[k++] = connectors[i];
                }
                connectors = results;

                // Report this property change to interested listeners
                support.firePropertyChange("connector", connector, null);
            }

    修改后为:

            synchronized (connectors) {
            List<Connector>list=Arrays.asList(connectors);
            synchronized (list) {
               if(list.contains(connector))
             list.remove(connector);
            else
             return;
            connectors=list.toArray(new Connector[0]);
        }
       }

    这里暂且不清楚第二个synchronized是否有必要...

    start()方法:

        public void start() throws LifecycleException {

            // Validate and update our current component state
            if (log.isInfoEnabled() && started) {
                log.info(sm.getString("standardService.start.started"));
            }
           
            if( ! initialized )
                init();

            // Notify our interested LifecycleListeners
            lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
            if(log.isInfoEnabled())
                log.info(sm.getString("standardService.start.name", this.name));
            lifecycle.fireLifecycleEvent(START_EVENT, null);
            started = true;

            // Start our defined Container first
            if (container != null) {
                synchronized (container) {
                    if (container instanceof Lifecycle) {
                        ((Lifecycle) container).start();
                    }
                }
            }

            synchronized (executors) {
                for ( int i=0; i<executors.size(); i++ ) {
                    executors.get(i).start();
                }
            }

            // Start our defined Connectors second
            synchronized (connectors) {
                for (int i = 0; i < connectors.length; i++) {
                    if (connectors[i] instanceof Lifecycle)
                        ((Lifecycle) connectors[i]).start();
                }
            }
           
            // Notify our interested LifecycleListeners
            lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);

        }

        protected ArrayList<Executor> executors = new ArrayList<Executor>();

    该列表管理的是Executor,该接口在6.0中才引入,由于文档质量原因,目前还无法搞明白。留待后文!

    它的标准实现为org.apache.catalina.core.StandardThreadExecutor,下面会对该类进行分析。

  • 相关阅读:
    领料单取整
    财务应付金额对不上的
    销售订单计算交期
    辅助单位启用
    K3CLOUD日志目录
    QLIKVIEW-日期格式,数字格式写法
    MRP运算报错-清除预留
    整单折扣后 财务、暂估应付价税合计对不上的问题处理
    BZOJ 2976: [Poi2002]出圈游戏 Excrt+set
    BZOJ 3060: [Poi2012]Tour de Byteotia 并查集
  • 原文地址:https://www.cnblogs.com/macula7/p/1960481.html
Copyright © 2020-2023  润新知