Tomcat版本tomcat6.0.44
观察catalina.sh文件,启动入口:org.apache.catalina.startup.Bootstrap,该类main方法执行下面三个方法-------------------------------------------------init() load() start()得到Catalina实例 | | | | | | | | | |catalina.java | | -----------------------↓---------------------↓------------- load() start() Catalina的load()方法: | | a、调用initDirs和initNaming()做tmp路径和命名的初始化。 | | b、调用 createStartDigester();生成Digester对象。Digester类负责进行配置文件的解析。 | | c、加载配置文件(server.xml),获取输入流InputStream对象 | | d、利用Digester解析配置文件输入流,解析之后,获取配置的root节点表示对象,也就是Server对象。 | | e、对上一步生成的server对象进行初始化,调用initialize()启动standServer.java | | -----------------------↓---------------------↓------------- initialize() start() Server遍历下属的多个Service,调用每一个server的initialize()/start() | | | | | | | |standService.java | | -----------------------↓---------------------↓------------- initialize() start() | | | | | | | |connector.java | | -----------------------↓---------------------↓------------- initialize() container.start()------>容器Engine.start(),先不关注 | executor.start()------->线程池执行器初始化,该线程做什么用? | connector.start()------>遍历所有的下属connector,并分别start(),重点分析 | | | | Connector的initialize()方法: | | a、protocolHander.setAdapter(new CoyoteAdapter(this)) | | b、调用protocolHander的init()方法 | | | |Http11NioProtocol.java | -----------------------↓---------------------↓------------- init() start() | | HTTP1ApiProtocol的init()方法: | | a、ep.sethander(Http11ConnectionHandler) | | b、调用ep的initNioEndpoint.java | | -----------------------↓---------------------↓------------- init() start()NioEndpoint.init(){ ServerSocketChannel serverSock = ServerSocketChannel.open(); //server通道初始化 serverSock.socket().bind(addr,backlog); //绑定地址,开始进行监听accecpt事件 NioSelectorPool selectorPool.open();//选择器池初始化 ……}NioEndpoint.start(){ //初始化处理线程池,该线程用来处理数据请求 executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), 60, TimeUnit.SECONDS,taskqueue, tf); //初始化poller后台线程组 for() { Thread pollerThread = new Thread(pollers[i], getName() + "-ClientPoller-"+i); pollerThread.start(); } //初始化acceptor后台线程组 for() { Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i); acceptorThread.start(); } ……}