Jetty源码剖析系列(3)-Connector如何接收处理网络请求

在本系列的第一篇提到,Jetty由Connector组件负责接收网络请求,如下图:

ServerConnector是Jetty Connector的实现类,我们直接看它的doStart方法: 它先是调用了父类AbstractNetworkConnectordoStart方法: 这个父类的doStart方法先是调用了open方法,注意这里实际调用的是ServerConnector实现的open方法: 它先是调用openAcceptChannel方法来创建一个NIO的ServerSocketChannel 上面的就是一个经典的NIO ServerSocketChannel创建过程:先是ServerSocketChannel.open(),然后再把ServerSocketChannelServerSocket绑定到相应的InetSocketAddress,熟悉的配方,熟悉的味道:)
再回到ServerConnectoropen方法,它拿到这个ServerSocketChannel后,会调用它的configureBlocking方法,把它设置为阻塞的,这里其实是为了设置它的ServerSocket在调用accept方法的时是阻塞模式(即调用accept方法就会进入线程阻塞直到有网络连接进来)。
我们再回到AbstractNetworkConnectordoStart方法,当它执行完open方法打开ServerSocketChannel后,接着会调用它的父类AbstractConnectordoStart方法: 这个方法很重要,到这里就开始了本文真正要关注的地方:Connector是如何接收处理网络请求的。我们来看其中的这段代码: 我们先看一下_acceptorsAbstractConnector的构造方法里初始化的)是什么: 我们可以看到它其实是个acceptor(我翻译为网络请求接收者)线程数组,这个数组的长度定得有点讲究,如果你没有指定acceptor的数目,acceptors这个值传进来的时候会默认为-1,那么就会将主机的CPU数量除以8取整跟4比较取最小的再跟1比较取最大的,如果acceptors的数目比JVM CPU的数目还多的话,它就会通过打一句log来提醒你Acceptor的数目不应大于JVM CPU的数目。

TO BE CONTINUE.....

comments powered by Disqus