读书人

tomcat 六的JIoEndpoint

发布时间: 2012-09-02 21:00:34 作者: rapoo

tomcat 6的JIoEndpoint

先上个图先,一个只有我自己能看懂的url时序图.

tomcat 六的JIoEndpoint


这个基本上是connentor初始化的时候,初始化了Http11Protocol,接着初始化JIoEndpoint,初始化介绍后,connentor调用start()方法开始工作鸟,接着调用Http11Protocol,JIoEndpoint的start()方法,JIoEndpoint的start()方法大有可为,看代码:

?? start()方法中如果没有外部的executor的话,会使用的自己内部的简单的工作线程池WorkerStack,这个线程池放着处理请求的线程集合,当请求的数量超过定义的最大支持线程数,那么后面的请求一直阻塞等待只到有可以使用的线程为止。

?看代码

acceptorThreadCount一般的值就是1,这里另外开启一个线程,Acceptor是个内部类, 看代码:

?

     public void run() {            // Process requests until we receive a shutdown signal            while (running) {                // Wait for the next socket to be assigned                Socket socket = await();                if (socket == null)                    continue;                // Process the request from this socket                if (!setSocketOptions(socket) || !handler.process(socket)) {                    // Close socket                    try {                        socket.close();                    } catch (IOException e) {                    }                }                // Finish up this request                socket = null;                recycleWorkerThread(this);            }        }
?

?? 这个里面调用了await()方法,就是上面所说的获得正确的socket,然后执行和SocketProcessor内部类实现的一样的功能的代码,最后做一些线程回收的工作

?

?

这里有一点可能会影响到性能,就是Worker线程池最大时,就需要阻塞等待,知道有可以用的线程,这个可能是考虑到如果线程开太多,内部压力大,线程的切换消耗大,这个可以作为tomcat调优的一个点,另外一个就是可以使用外部的线程池,这个也可以尝试

?

? 哇,真长!

?

?

?

?

?

?

?

?

读书人网 >软件架构设计

热点推荐