Bootstrap 的 init 方法中 通过反射动态调用 Catalina.start() 
Catalina 类 负责开始或者停止服务
 Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
 Object startupInstance 
= startupClass.newInstance();
Catalina 完成了3个任务 
  •  处理xml文件, load 方法中使用 Digester 处理server.xml文件,转化为java对象
if (getServer() == null) {
            load();
        }
  •     实例化一个server  

 getServer().start();
  •      给jvm 注册一个关闭 的Hook(钩子)
Runtime.getRuntime().addShutdownHook(shutdownHook);
  • 线程等待
 await();  调用 StandardServer 的 await()   StandardServer 处理 Server相关的操作,
     /**
     * Wait until a proper shutdown command is received, then return.
     * This keeps the main thread alive - the thread pool listening for http
     * connections is daemon threads.
     */
     StandardServer.await() 处理 当前的主线程,即 启动 tomcat 的主线程

    
try {
        awaitSocket 
= new ServerSocket(port, 1,
                InetAddress.getByName(address));
    }

    
catch( IOException e ) {
        log.error(
"StandardServer.await: create[" + address + ":" + port + "]: ", e);
        
return;
    }

    
try {
        awaitThread 
= Thread.currentThread();

// Loop waiting for a connection and a valid command
        while (!stopAwait) {
            ServerSocket serverSocket 
= awaitSocket;

            
if (serverSocket == null) {
                
break;
            }
// Wait for the next connection
            Socket socket = null;
            StringBuilder command 
= new StringBuilder();
            
try {
                InputStream stream;
                
try {
                    socket 
= serverSocket.accept();
                    socket.setSoTimeout(
10 * 1000);  // Ten seconds
                    stream = socket.getInputStream();
                } 
catch (AccessControlException ace) {
                    log.warn(
"StandardServer.accept security exception: " + ace.getMessage(), ace);
                    
continue;
                } 
catch (IOException e) {
                    
if (stopAwait) {
// Wait was aborted with socket.close()
                        break;
                    }
                    log.error(
"StandardServer.await: accept: ", e);
                    
break;
                }
// Read a set of characters from the socket
                int expected = 1024// Cut off to avoid DoS attack
                while (expected < shutdown.length()) {
                    
if (random == null)
                        random 
= new Random();
                    expected 
+= (random.nextInt() % 1024);
                }
                
while (expected > 0) {
                    
int ch = -1;
                    
try {
                        ch 
= stream.read();
                    } 
catch (IOException e) {
                        log.warn(
"StandardServer.await: read: ", e);
                        ch 
= -1;
                    }
                    
if (ch < 32)  // Control character or EOF terminates loop
                        break;
                    command.append((
char) ch);
                    expected
--;
                }
            } 
finally {
// Close the socket now that we are done with it
                try {
                    
if (socket != null) {
                        socket.close();
                    }
                } 
catch (IOException e) {
// Ignore
                }
            }

// Match against our command string
            boolean match = command.toString().equals(shutdown);
            
if (match) {
                log.info(sm.getString(
"standardServer.shutdownViaPort"));
                
break;
            } 
else
                log.warn(
"StandardServer.await: Invalid command '"
                        
+ command.toString() + "' received");
        }
    }

    
finally {
        ServerSocket serverSocket 
= awaitSocket;
        awaitThread 
= null;
        awaitSocket 
= null;
// Close the server socket and return
        if (serverSocket != null) {
            
try {
                serverSocket.close();
            } 
catch (IOException e) {
// Ignore
            }
        }
    }

只有注册用户登录后才能发表评论。


网站导航: