前两篇我们分析了Tomcat服务的启动过程和Connector(连接器)。现在让我们看看一次Tomcat服务器是怎么提供HTTP服务的。
上文我们说到endpoint是底层处理I/O具体实现类,那么一次HTTP首先也要从这个类中开始。还是以NIOEndPoint实现类为例子。在NIOEndPoint类中有一个名为Acceptor内部类。该内部类负责接收即将到来的TCP/IP连接,并将它们分配给合适的processor处理。
HTTP底层是TCP协议,Java实现TCP协议的具体的方式就是Socket连接。我相信只要了解一点Java网络编程方面的知识都会了解的,不在累述。另一个比较重要的方法是setSocketOptions(),该方法是将socket连接添加到一个缓存队列里面。这里使用的是生产者和消费者模式,如果对该模式有不了解,请看我的另一个博文,Java并发之生产者和消费者模型http://blog.csdn.net/c275046758/article/details/50492107。
setSocketOptions方法内获得了channel。channel是java nio中的概念,有不了解的请查看Java nio的相关内容。然后在register()方法中将channel添加到缓存队列中。
addEvent方法是内部类poller内的一个私有方法。为了能看的更清晰,故将这两个方法放在一起呈现。
Poller类实现了Runnable接口,是一个线程类。在run方法的15-31行中具体实现了java nio的一些代码。28行继续调用了processKey方法。接着调用了processSocket()方法。
在processSocket方法中,将具体的nio连接转换成socketProcessor处理线程。这个类是一个工作线程。可以将其理解成生产者消费者模型中的消费者。然后通过executor执行这个线程。
从上一篇中我们知道handler是处理协议的地方。process方法在AbstractProcessorLight中的实现。AbstractProcessorLight是一个轻量级的抽象processor实现。
接着会调用service方法。看到这个方法是不是会有种莫名的激动,是不是servlet的生命周期方法service方法很像呢。别着急,让我们看看service的具体实现。
在前面经过复杂的处理后,在代码的26行调用了service方法,而它的参数正好是request和response。正好是service()生命周期方法。
自己研究源码的一点心得,如有错误请批评指正。