Netty源码分析第3章(客户端接入流程)---->第5节: 监听读事件

 

Netty源码分析第三章: 客户端接入流程html

 

第五节: 监听读事件promise

 

咱们回到AbstractUnsafe的register0()方法:oop

private void register0(ChannelPromise promise) { try { //省略代码 //作实际的注册
 doRegister(); neverRegistered = false; registered = true; //触发事件
 pipeline.invokeHandlerAddedIfNeeded(); safeSetSuccess(promise); //触发注册成功事件
 pipeline.fireChannelRegistered(); if (isActive()) { if (firstRegistration) { //传播active事件(4)
 pipeline.fireChannelActive(); } else if (config().isAutoRead()) { beginRead(); } } } catch (Throwable t) { //省略代码
 } }

doRegister()作完实际的注册以后, 会走到if (isActive())这个判断, 由于这个时候链路已经完成, 因此这里是true, 默认判断条件if (firstRegistration)也为true, 因此这里会走到pipeline.fireChannelActive()这一步源码分析

有关pipeline咱们会在下一章进行详细分析, 这里咱们只须要知道, 最后会流转到AbstractUnsafe的beginRead()方法学习

跟到beginRead()方法:this

public final void beginRead() { assertEventLoop(); if (!isActive()) { return; } try { doBeginRead(); } catch (final Exception e) { //代码省略
 } }

这块代码一样咱们也不陌生, 由于咱们分析NioServerSocketChannel也分析过了这一步spa

咱们继续跟到doBeginRead():debug

protected void doBeginRead() throws Exception { //拿到selectionKey
    final SelectionKey selectionKey = this.selectionKey; if (!selectionKey.isValid()) { return; } readPending = true; //得到感兴趣的事件
    final int interestOps = selectionKey.interestOps(); //判断是否是对任何事件都不监听
    if ((interestOps & readInterestOp) == 0) { //此条件成立 //将以前的accept事件注册, readInterest表明能够读取一个新链接的意思
        selectionKey.interestOps(interestOps | readInterestOp); } }

这段代码相信你们会比较熟悉, 由于咱们服务端channel注册完以后也走到了这里rest

由于咱们在建立NioSocketChannel的时候初始化的是read事件, selectionKey是channel在注册时候返回的key, 因此selectionKey.interestOps(interestOps | readInterestOp)这一步, 会将当前channel的读事件注册到selector中去code

注册完成以后, NioEventLoop就能够轮询当前channel的读事件了

以上就是NioSocketChannel注册监听事件的流程

 

 

第三章总结

    本章学习了有关客户端接入, NioSocketChannel的建立, 注册等相关操做, 而且涉及到了上一小节剖析的eventLoop的相关逻辑, 同窗们能够将相关的流程经过debug的方式走一遍以加深印象

 

上一节: NioSocketChannel注册到selector

下一节: pipeline的建立

相关文章
相关标签/搜索