Netty分布式源码分析监听读事件
作者:向南是个万人迷 发布时间:2022-10-23 20:59:43
前文传送门:NioSocketChannel注册到selector
我们回到AbstractUnsafe的register0()方法:
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()方法:
public final void beginRead() {
assertEventLoop();
if (!isActive()) {
return;
}
try {
doBeginRead();
} catch (final Exception e) {
//代码省略
}
}
这块代码同样我们也不陌生, 因为我们分析NioServerSocketChannel也分析过了这一步
我们继续跟到doBeginRead():
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注册完之后也走到了这里
因为我们在创建NioSocketChannel的时候初始化的是read事件, selectionKey是channel在注册时候返回的key, 所以selectionKey.interestOps(interestOps | readInterestOp)这一步, 会将当前channel的读事件注册到selector中去
注册完成之后, NioEventLoop就可以轮询当前channel的读事件了
章节小结
本章学习了有关客户端接入, NioSocketChannel的创建, 注册等相关操作, 并且涉及到了上一小节剖析的eventLoop的相关逻辑, 同学们可以将相关的流程通过debug的方式走一遍以加深印象
来源:https://www.cnblogs.com/xiangnan6122/p/10204030.html


猜你喜欢
- 1.循环遍历private void GetControls(Control fatherControl){ Co
- 主要使用的类:java.text.DecimalFormat1。实例化对象,可以用如下两种方法:DecimalFormat df=(Deci
- 本文实例讲述了Java使用Math.random()结合蒙特卡洛方法计算pi值。分享给大家供大家参考,具体如下:一、概述蒙特·卡罗方法(Mo
- 这篇文章主要介绍了如何基于LoadingCache实现Java本地缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 目录顶级语句弃元参数仅初始化设置器 (Init only setters)记录类型 (Record)模式匹配增强Type patterns
- 先贴正确配置<?xml version="1.0" encoding="UTF-8"?>
- 第一个为大家分享的是C#字符串使用密钥进行加解密代码,具体内容如下public class DesEncrypt {  
- 本文实例讲述了C#适用于like语句的SQL格式化函数,分享给大家供大家参考。具体实现代码如下:/// <summary> //
- 1.什么是Spring Boot为什么要学Spring Boot?Spring 的诞生是为了简化 Java 程序的开发的, Spring B
- 前言:今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结。简介WebView是一个基于we
- 从C#3.0开始,可以使用lambda表达式把实现代码赋予委托。lambda表达式与委托(https://www.jb51.net/arti
- 前言在应用启动的时候,为了加快启动速度,往往需要把一些比较重的操作放到子线程中,或者是延时加载。将任务放在子线程中是一个比较简单并且看起来有
- aes 对称加密密钥必须是32字节using System;using System.Security.Cryptography;using
- 这篇文章主要介绍了Springboot整合Shiro的代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 一、多媒体应用架构1.1 音视频传统应用架构通常,传统的播放音频或视频的多媒体应用由两部分组成:播放器:用于吸收数字媒体并将其呈现为视频和/
- renameTo方法public boolean renameTo(File dest),File类中的renameTo方法可以操作文件或目
- springboot集成mybatis plus和dynamic-datasource注意事项环境spring-boot-starter-p
- 1、同步消息即时性较强,重要的消息,且必须有回执的消息,例如短信,通知(转账成功)生产者:public class Producer { &
- 使用filter设置要排除的URL@WebFilter(urlPatterns = "/*")@Order(value
- 什么是容器?在Java的GUI界面设计中,关于容器的理解,从字面意思我们就可以认为它是存放控件的地方,而这个地方依托在窗体之上,常用的容器是