47

Jetty源码剖析系列(7) - 底层网络通信的细节

 6 years ago
source link: http://ericcenblog.com/2018/04/16/jettyyuan-ma-pou-xi-xi-lie-7-di-ceng-wang-luo-tong-xin-de-xi-jie/?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
我们先来回顾一下Jetty负责网络连接的类ServerConnector的构造函数: 可以看到在ServerConnector的构造函数里会创建一个SelectorManager,然后加到它的bean里面(这里其实体现了Jetty的一个设计模式,就是设计了一个containner,把相关的模块放到这个containner里面,启动该container(调用doStart方法)就会连带启动里面的模块(调用模块的doStart方法), Jetty里面的Server,Connector都是这样的containner。) 我们再来看newSelectorManager方法: 就是创建一个ServerConnectorManager对象,ServerConnectorManager继承了SelectorManager类: ,我们再看一下SelectorManager的doStart方法: 可以看到在调用父类的doStart方法之前,会创建ManagedSelector,并将该selector加到SelectorManager的bean里面,随后再在调用父类的doStart方法时调用该selector的doStart方法,注意selector的数目是根据CPU的数量计算出来的, newSelector方法其实就是直接构建一个ManagedSelector对象: 我们看一下ManagedSelector的构造函数: 关于ManagedSelector,我在系列(4)里面已经有详细剖析。 此时我们先回过头去看一下ServerConnector的doStart方法: 它先调用open方法打开ServerSocketChannel,这个我在系列(6)里面有详细剖析。我们这里关注一下它调用的父类的doStart(AbstractConnector)方法: 它先调用了父类ConntainnerLifeCycle的doStart方法将它所拥有的bean(模块)都启动起来,其中就包括了我们前面加进去的SelectorManager,随即也就会把SelectorManager里面的ManagedSelector启动起来(调用它的doStart方法)。到此,我们可以看到ServerConnector会先启动Selector,然后再启动Acceptor。Connector,Selector,Acceptor,这三者的关系我画了下图来说明: 从上图可以看到,Acceptor负责接收网络连接,

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK