扫码关注公众号:芋道源码

发送: 百事可乐
获取永久解锁本站全部文章的链接

《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://ericcenblog.com/2017/11/02/jettyyuan-ma-pou-xi-xi-lie-3-connectorru-he-jie-shou-wang-luo-qing-qiu/ 「Eric Cen」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

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

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

TO BE CONTINUE…..

文章目录