tomcat加载Listener,Filter,Servlet顺序

来源:互联网 发布:pyqt5 知乎编程 编辑:程序博客网 时间:2024/05/20 12:49

在core包的StandrdContext的startInternal方法中


/**     * Start this component and implement the requirements     * of {@link org.apache.catalina.util.LifecycleBase#startInternal()}.     *     * @exception LifecycleException if this component detects a fatal error     *  that prevents this component from being used     */    @Override    protected synchronized void startInternal() throws LifecycleException {        if(log.isDebugEnabled())            log.debug("Starting " + getBaseName());        // Send j2ee.state.starting notification        if (this.getObjectName() != null) {            Notification notification = new Notification("j2ee.state.starting",                    this.getObjectName(), sequenceNumber.getAndIncrement());            broadcaster.sendNotification(notification);        }        setConfigured(false);        boolean ok = true;        // Currently this is effectively a NO-OP but needs to be called to        // ensure the NamingResources follows the correct lifecycle        if (namingResources != null) {            namingResources.start();        }        // Add missing components as necessary        if (getResources() == null) {   // (1) Required by Loader            if (log.isDebugEnabled())                log.debug("Configuring default Resources");            try {                setResources(new StandardRoot(this));            } catch (IllegalArgumentException e) {                log.error("Error initializing resources: " + e.getMessage());                ok = false;            }        }        if (ok) {            resourcesStart();        }        if (getLoader() == null) {            WebappLoader webappLoader = new WebappLoader(getParentClassLoader());            webappLoader.setDelegate(getDelegate());            setLoader(webappLoader);        }        // Initialize character set mapper        getCharsetMapper();        // Post work directory        postWorkDirectory();        // Validate required extensions        boolean dependencyCheck = true;        try {            dependencyCheck = ExtensionValidator.validateApplication                (getResources(), this);        } catch (IOException ioe) {            log.error("Error in dependencyCheck", ioe);            dependencyCheck = false;        }        if (!dependencyCheck) {            // do not make application available if depency check fails            ok = false;        }        // Reading the "catalina.useNaming" environment variable        String useNamingProperty = System.getProperty("catalina.useNaming");        if ((useNamingProperty != null)            && (useNamingProperty.equals("false"))) {            useNaming = false;        }        if (ok && isUseNaming()) {            if (getNamingContextListener() == null) {                NamingContextListener ncl = new NamingContextListener();                ncl.setName(getNamingContextName());                ncl.setExceptionOnFailedWrite(getJndiExceptionOnFailedWrite());                addLifecycleListener(ncl);                setNamingContextListener(ncl);            }        }        // Standard container startup        if (log.isDebugEnabled())            log.debug("Processing standard container startup");        // Binding thread        ClassLoader oldCCL = bindThread();        try {            if (ok) {                // Start our subordinate components, if any                Loader loader = getLoader();                if ((loader != null) && (loader instanceof Lifecycle))                    ((Lifecycle) loader).start();                // since the loader just started, the webapp classloader is now                // created.                setClassLoaderProperty("clearReferencesStatic",                        getClearReferencesStatic());                setClassLoaderProperty("clearReferencesStopThreads",                        getClearReferencesStopThreads());                setClassLoaderProperty("clearReferencesStopTimerThreads",                        getClearReferencesStopTimerThreads());                setClassLoaderProperty("clearReferencesHttpClientKeepAliveThread",                        getClearReferencesHttpClientKeepAliveThread());                // By calling unbindThread and bindThread in a row, we setup the                // current Thread CCL to be the webapp classloader                unbindThread(oldCCL);                oldCCL = bindThread();                // Initialize logger again. Other components might have used it                // too early, so it should be reset.                logger = null;                getLogger();                Cluster cluster = getClusterInternal();                if ((cluster != null) && (cluster instanceof Lifecycle))                    ((Lifecycle) cluster).start();                Realm realm = getRealmInternal();                if ((realm != null) && (realm instanceof Lifecycle))                    ((Lifecycle) realm).start();                // Notify our interested LifecycleListeners                fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null);                // Start our child containers, if not already started                for (Container child : findChildren()) {                    if (!child.getState().isAvailable()) {                        child.start();                    }                }                // Start the Valves in our pipeline (including the basic),                // if any                if (pipeline instanceof Lifecycle) {                    ((Lifecycle) pipeline).start();                }                // Acquire clustered manager                Manager contextManager = null;                Manager manager = getManager();                if (manager == null) {                    if (log.isDebugEnabled()) {                        log.debug(sm.getString("standardContext.cluster.noManager",                                Boolean.valueOf((getCluster() != null)),                                Boolean.valueOf(distributable)));                    }                    if ( (getCluster() != null) && distributable) {                        try {                            contextManager = getCluster().createManager(getName());                        } catch (Exception ex) {                            log.error("standardContext.clusterFail", ex);                            ok = false;                        }                    } else {                        contextManager = new StandardManager();                    }                }                // Configure default manager if none was specified                if (contextManager != null) {                    if (log.isDebugEnabled()) {                        log.debug(sm.getString("standardContext.manager",                                contextManager.getClass().getName()));                    }                    setManager(contextManager);                }                if (manager!=null && (getCluster() != null) && distributable) {                    //let the cluster know that there is a context that is distributable                    //and that it has its own manager                    getCluster().registerManager(manager);                }            }            if (!getConfigured()) {                log.error( "Error getConfigured");                ok = false;            }            // We put the resources into the servlet context            if (ok)                getServletContext().setAttribute                    (Globals.RESOURCES_ATTR, getResources());            if (ok ) {                if (getInstanceManager() == null) {                    javax.naming.Context context = null;                    if (isUseNaming() && getNamingContextListener() != null) {                        context = getNamingContextListener().getEnvContext();                    }                    Map<String, Map<String, String>> injectionMap = buildInjectionMap(                            getIgnoreAnnotations() ? new NamingResourcesImpl(): getNamingResources());                    setInstanceManager(new DefaultInstanceManager(context,                            injectionMap, this, this.getClass().getClassLoader()));                    getServletContext().setAttribute(                            InstanceManager.class.getName(), getInstanceManager());                }            }            // Create context attributes that will be required            if (ok) {                getServletContext().setAttribute(                        JarScanner.class.getName(), getJarScanner());            }            // Set up the context init params            mergeParameters();            // Call ServletContainerInitializers            for (Map.Entry<ServletContainerInitializer, Set<Class<?>>> entry :                initializers.entrySet()) {                try {                    entry.getKey().onStartup(entry.getValue(),                            getServletContext());                } catch (ServletException e) {                    log.error(sm.getString("standardContext.sciFail"), e);                    ok = false;                    break;                }            }            // Configure and call application event listeners            if (ok) {                if (!<strong><span style="color:#ff0000;">listenerStart()</span></strong>) {                    log.error( "Error listenerStart");                    ok = false;                }            }            // Check constraints for uncovered HTTP methods            // Needs to be after SCIs and listeners as they may programatically            // change constraints            if (ok) {                checkConstraintsForUncoveredMethods(findConstraints());            }            try {                // Start manager                Manager manager = getManager();                if ((manager != null) && (manager instanceof Lifecycle)) {                    ((Lifecycle) manager).start();                }            } catch(Exception e) {                log.error("Error manager.start()", e);                ok = false;            }            // Configure and call application filters            if (ok) {                if (!<span style="color:#ff0000;">filterStart()</span>) {                    log.error("Error filterStart");                    ok = false;                }            }            // Load and initialize all "load on startup" servlets            if (ok) {                if (!<span style="color:#ff0000;"><strong>loadOnStartup(findChildren())</strong></span>){                    log.error("Error loadOnStartup");                    ok = false;                }            }            // Start ContainerBackgroundProcessor thread            super.threadStart();        } finally {            // Unbinding thread            unbindThread(oldCCL);        }        // Set available status depending upon startup success        if (ok) {            if (log.isDebugEnabled())                log.debug("Starting completed");        } else {            log.error(sm.getString("standardContext.startFailed", getName()));        }        startTime=System.currentTimeMillis();        // Send j2ee.state.running notification        if (ok && (this.getObjectName() != null)) {            Notification notification =                new Notification("j2ee.state.running", this.getObjectName(),                                 sequenceNumber.getAndIncrement());            broadcaster.sendNotification(notification);        }        // Reinitializing if something went wrong        if (!ok) {            setState(LifecycleState.FAILED);        } else {            setState(LifecycleState.STARTING);        }    }


0 0
原创粉丝点击