首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

解析Tomcat处置请求的类Connector<一>

2012-07-24 
解析Tomcat处理请求的类Connector一?????? Connector类的相关配置在Tomcat的安装目录conf下的Server.xml

解析Tomcat处理请求的类Connector<一>

?????? Connector类的相关配置在Tomcat的安装目录conf下的Server.xml文件里,我这次主要解析采用NIO方式处理请求的情况.在Server.xml的配置如下:

?

?

在tomcat启动的时候,会调用Connector类的Start()方法,根据以上配置,Connector的start方法里会调用Http11NioProtocol类的start()方法,如下:

??

?? Http11NioProtocol类的start()方法又会调用NioEndpoint类的start()方法,如下:

???

??? 该方式初始化了处理接受Sockt的线程Acceptor,轮询sockt的线程Poller,真正处理socket的线程池executor 或workers.Acceptor类的run方法如下:

?

 public void run() {            // Loop until we receive a shutdown command            while (running) {                try {                    // Loop if endpoint is paused                    while (paused && (!close) ) {                        try {                            Thread.sleep(100);                        } catch (InterruptedException e) {                            // Ignore                        }                    }                    boolean hasEvents = false;                    hasEvents = (hasEvents | events());//往Selector注册Socket事件                    // Time to terminate?                    if (close) {                        timeout(0, false);                        break;                    }                    int keyCount = 0;                    try {                        if ( !close ) {                            if (wakeupCounter.getAndSet(-1) > 0) {                                //if we are here, means we have other stuff to do                                //do a non blocking select                                keyCount = selector.selectNow();                            } else {                                keyCount = selector.select(selectorTimeout);                            }                            wakeupCounter.set(0);                        }                        if (close) {                            timeout(0, false);                            selector.close();                             break;                         }                    } catch ( NullPointerException x ) {                        //sun bug 5076772 on windows JDK 1.5                        if ( log.isDebugEnabled() ) log.debug("Possibly encountered sun bug 5076772 on windows JDK 1.5",x);                        if ( wakeupCounter == null || selector == null ) throw x;                        continue;                    } catch ( CancelledKeyException x ) {                        //sun bug 5076772 on windows JDK 1.5                        if ( log.isDebugEnabled() ) log.debug("Possibly encountered sun bug 5076772 on windows JDK 1.5",x);                        if ( wakeupCounter == null || selector == null ) throw x;                        continue;                    } catch (Throwable x) {                        log.error("",x);                        continue;                    }                    //either we timed out or we woke up, process events first                    if ( keyCount == 0 ) hasEvents = (hasEvents | events());                    Iterator iterator = keyCount > 0 ? selector.selectedKeys().iterator() : null;                    // Walk through the collection of ready keys and dispatch                    // any active event.                    while (iterator != null && iterator.hasNext()) {                        SelectionKey sk = (SelectionKey) iterator.next();                        KeyAttachment attachment = (KeyAttachment)sk.attachment();                        // Attachment may be null if another thread has called                        // cancelledKey()                        if (attachment == null) {                            iterator.remove();                        } else {                            attachment.access();                            iterator.remove();                            processKey(sk, attachment);//将Socket交由线程池executor 或workers处理                        }                    }//while                    //process timeouts                    timeout(keyCount,hasEvents);                    if ( oomParachute > 0 && oomParachuteData == null ) checkParachute();                } catch (OutOfMemoryError oom) {                    try {                        oomParachuteData = null;                        releaseCaches();                        log.error("", oom);                    }catch ( Throwable oomt ) {                        try {                            System.err.println(oomParachuteMsg);                            oomt.printStackTrace();                        }catch (Throwable letsHopeWeDontGetHere){}                    }                }            }//while            synchronized (this) {                this.notifyAll();            }            stopLatch.countDown();        }

?

?????? 后续就是处理sockt请求,返回处理结果到浏览器端

热点排行