美文网首页
《深入剖析tomcat》[4]

《深入剖析tomcat》[4]

作者: 老林_ | 来源:发表于2021-06-01 15:48 被阅读0次

    启动类Bootstrap.java

    public final class Bootstrap {
      public static void main(String[] args) {
        HttpConnector connector = new HttpConnector();
        SimpleContainer container = new SimpleContainer();
        connector.setContainer(container);
        try {
          connector.initialize();
          connector.start();
    
          // make the application wait until we press any key.
          System.in.read();
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
    

    简单容器类SimpleContainer.java
    //主要是里面的invoke方法,处理了servlet

    public class SimpleContainer implements Container {
       ----
       public void invoke(Request request, Response response)
        throws IOException, ServletException {
    
        String servletName = ( (HttpServletRequest) request).getRequestURI();
        servletName = servletName.substring(servletName.lastIndexOf("/") + 1);
        URLClassLoader loader = null;
        try {
          URL[] urls = new URL[1];
          URLStreamHandler streamHandler = null;
          File classPath = new File(WEB_ROOT);
          String repository = (new URL("file", null, classPath.getCanonicalPath() + File.separator)).toString() ;
          urls[0] = new URL(null, repository, streamHandler);
          loader = new URLClassLoader(urls);
        }
        catch (IOException e) {
          System.out.println(e.toString() );
        }
        Class myClass = null;
        try {
          myClass = loader.loadClass(servletName);
        }
        catch (ClassNotFoundException e) {
          System.out.println(e.toString());
        }
    
        Servlet servlet = null;
    
        try {
          servlet = (Servlet) myClass.newInstance();
          servlet.service((HttpServletRequest) request, (HttpServletResponse) response);
        }
        catch (Exception e) {
          System.out.println(e.toString());
        }
        catch (Throwable e) {
          System.out.println(e.toString());
        }
    
    
    
      }
    
    }
    

    默认HttpProcessor处理器开启了多线程处理请求
    conector的run()方法

    public void run() {
            // Loop until we receive a shutdown command
            while (!stopped) {
                // Accept the next incoming connection from the server socket
                Socket socket = null;
                try {
                    //                if (debug >= 3)
                    //                    log("run: Waiting on serverSocket.accept()");
                    socket = serverSocket.accept();
                    //                if (debug >= 3)
                    //                    log("run: Returned from serverSocket.accept()");
                    if (connectionTimeout > 0)
                        socket.setSoTimeout(connectionTimeout);
                    socket.setTcpNoDelay(tcpNoDelay);
                } catch (AccessControlException ace) {
                    log("socket accept security exception", ace);
                    continue;
                } catch (IOException e) {
                    //                if (debug >= 3)
                    //                    log("run: Accept returned IOException", e);
                    try {
                        // If reopening fails, exit
                        synchronized (threadSync) {
                            if (started && !stopped)
                                log("accept error: ", e);
                            if (!stopped) {
                                //                    if (debug >= 3)
                                //                        log("run: Closing server socket");
                                serverSocket.close();
                                //                        if (debug >= 3)
                                //                            log("run: Reopening server socket");
                                serverSocket = open();
                            }
                        }
                        //                    if (debug >= 3)
                        //                        log("run: IOException processing completed");
                    } catch (IOException ioe) {
                        log("socket reopen, io problem: ", ioe);
                        break;
                    } catch (KeyStoreException kse) {
                        log("socket reopen, keystore problem: ", kse);
                        break;
                    } catch (NoSuchAlgorithmException nsae) {
                        log("socket reopen, keystore algorithm problem: ", nsae);
                        break;
                    } catch (CertificateException ce) {
                        log("socket reopen, certificate problem: ", ce);
                        break;
                    } catch (UnrecoverableKeyException uke) {
                        log("socket reopen, unrecoverable key: ", uke);
                        break;
                    } catch (KeyManagementException kme) {
                        log("socket reopen, key management problem: ", kme);
                        break;
                    }
    
                    continue;
                }
    
                // Hand this socket off to an appropriate processor
                HttpProcessor processor = createProcessor();
                if (processor == null) {
                    try {
                        log(sm.getString("httpConnector.noProcessor"));
                        socket.close();
                    } catch (IOException e) {
                        ;
                    }
                    continue;
                }
                //            if (debug >= 3)
                //                log("run: Assigning socket to processor " + processor);
                processor.assign(socket);
    
                // The processor will recycle itself when it finishes
    
            }
    
            // Notify the threadStop() method that we have shut ourselves down
            //        if (debug >= 3)
            //            log("run: Notifying threadStop() that we have shut down");
            synchronized (threadSync) {
                threadSync.notifyAll();
            }
    
        }
    

    相关文章

      网友评论

          本文标题:《深入剖析tomcat》[4]

          本文链接:https://www.haomeiwen.com/subject/ckcwsltx.html