7.netty服务器中提交任务到NioEventLoop(Nio事件循环执行线程)

【README】

1.本文总结自 B站 《尚硅谷-netty》;

2.NioEventLoop实际上是一个提交到线程池的Runnable任务,在while无限循环中运行 taskQueue中的任务(串行);


【1】提交任务到NioEventLoop

1)NioEventLoop:

  • 表示一个不断循环执行的Runnable任务,每个NioEventLoop都有一个selector,用于监听绑定在其上的 socket 网络通道;

2)NioEventLoop 内部采用串行化设计:

  • 从消息的读取->解码->处理->编码->发送,始终由IO 线程 NioEventLoop 负责;

3)NioEventLoopGroup 下包含多个 NioEventLoop ;

  • 每个 NioEventLoop 中包含有一个 Selector,一个taskQueue ;
  • 每个 NioEventLoop 的 Selector 上可以注册监听多个NioChannel ;
  • 每个 NioChannel 只会绑定在唯一的 NioEventLoop 上;
  • 每个 NioChannel 都绑定有一个自己的 ChannelPipeline ;

4)任务提交到 NioEventLoop 后,实际会添加到 taskQueue ; 

  • taskQueue的访问路径如下:
    • ChannelHandlerContext ->
    • DefaultChannelPipeline  ->
    • NioSocketChannel ->
    • NioEventLoop ->
    • taskQueue (任务队列);

【1.1】场景1-在 netty server的handler中提交普通任务

/*** @Description netty服务器处理器* @author xiao tang* @version 1.0.0* @createTime 2022年08月27日*/
public class SimpleNettyServerHandler45 extends ChannelInboundHandlerAdapter {// 读写数据事件(读取客户端发送的消息)// 1. ChannelHandlerContext ctx: 上下文信息,包括管道pipeline,通道channel,地址// 2. Object msg: 客户端发送的数据,默认是 Object@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {System.out.println("server ctx = " + ctx);System.out.println("查看 channel 和 pipeline的关系 ");Channel channel = ctx.channel();ChannelPipeline channelPipeline = ctx.pipeline(); // 管道是双向链表,出栈入栈// 将 msg 转为 ByteBuf 字节缓冲// 这个 ByteBuf 是 netty提供的, 不是 nio的ByteBufferByteBuf buf = (ByteBuf) msg;System.out.println("客户端发送消息:" + buf.toString(StandardCharsets.UTF_8));System.out.println("客户端地址:" + ctx.channel().remoteAddress());// 同步任务1// 业务场景: 有一个耗时长的业务 -> 异步执行 -> 提交该 channel对应的 NIOEventLoop 的 taskQueue 中;
//        Thread.sleep(10 * 1000);
//        ctx.writeAndFlush(Unpooled.copiedBuffer("hello, 客户端,我是同步任务1", StandardCharsets.UTF_8));
//        System.out.println("go on.....");// 以上耗时操作的解决方案1:用户程序自定义的普通任务// 异步任务2ctx.channel().eventLoop().execute(new Runnable() {@Overridepublic void run() {try {Thread.sleep(10 * 1000);ctx.writeAndFlush(Unpooled.copiedBuffer("hello, 客户端,我是异步任务2-休眠10s", StandardCharsets.UTF_8));} catch (Exception e) {System.out.println("发生异常, " + e.getMessage());}}});// 异步任务3ctx.channel().eventLoop().execute(new Runnable() {@Overridepublic void run() {try {Thread.sleep(20 * 1000);ctx.writeAndFlush(Unpooled.copiedBuffer("hello, 客户端,我是异步任务3-休眠20s", StandardCharsets.UTF_8));} catch (Exception e) {System.out.println("发生异常, " + e.getMessage());}}});

【1.2】场景2-在 netty server的handler中提交定时任务

// 异步任务2和异步任务3添加到同一个任务队列,由同一个线程来运行,所以异步任务2阻塞10s,而异步任务3会阻塞30s(10+20)System.out.println("异步任务 go on.....");// 用户自定义定时任务 -》 定时任务提交到 scheduledTaskQueue 中ctx.channel().eventLoop().schedule(new Runnable() {@Overridepublic void run() {try {Thread.sleep(20 * 1000);ctx.writeAndFlush(Unpooled.copiedBuffer("hello, 客户端,我是定时任务1-休眠5s", StandardCharsets.UTF_8));} catch (Exception e) {System.out.println("发生异常, " + e.getMessage());}}}, 5, TimeUnit.SECONDS);System.out.println("定时任务 go on.....");

【代码解说】

  • 以上任务提交后,实际会添加到 taskQueue ; 
  • taskQueue的访问路径如下:
    • ChannelHandlerContext ->
    • DefaultChannelPipeline  ->
    • NioSocketChannel ->
    • NioEventLoop ->
    • taskQueue (任务队列);
  • 每个NioEventLoop只能使用1个独立线程运行任务队列中的任务,即多个任务串行执行

【补充】taskQueue目录树:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(十四.2)之PL / SQL的好处

一、PL / SQL的好处在Oracle数据库中使用PL / SQL编程语言有很多好处。 1.将过程构造与SQL集成 2.模块化程序开发 3.改进的性能 4.与Oracle工具集成 5.便携性6.异常处理二、优点 优点1:使用SQL集成程序化结构PL / SQL的首要优势是程序结构与SQL的集成。 SQL是一种非…

炒菜机器人的弊端_机器人炒菜真不是你想的那样!

7月8日下午,爱餐全产业链模式发布会在张家口进行,会上,张家口文旅投集团与上海爱餐机器人有限公司签订了3000台智能机器人设备合作协议,这些机器人可是身手不凡,清一色的都是会厨艺的炒菜机器人,未来他们还…

构建高性能.NET应用之配置高可用IIS服务器-第四篇 IIS常见问题之:工作进程回收机制(上)

通过三篇文章的普及,相信大家对IIS应该有了一个基本的了解。那么从本篇文章开始,我们就开始进入IIS一些比较实际的话题:如何配置IIS,使得其性能尽可能的高。 我们在本篇中主要讲述的就是“工作进程回收机制”,下面我们…

8.基于netty实现群聊,心跳检测

【README】 1.本文总结自B站《netty-尚硅谷》,很不错; 2.本文po出了 Unpooled创建缓冲区的 代码示例; 3.本文示例代码基于netty实现以下功能: 群聊客户端及服务器;心跳检测;【1】Unpooled创建缓冲区 U…

Oracle入门(十四.3)之创建PL / SQL块

一、PL / SQL块结构 一个PL / SQL块由三部分组成。PL / SQL块结构部分二、PL / SQL编译器用高级编程语言(C,Java,PL / SQL等)编写的每个程序都必须经过检查并转换为二进制代码(1和0),然后才能执…

[.NET Core].NET Core R2安装及示例教程

前言 前几天.NET Core发布了.NET Core 1.0.1 R2 预览版,之前想着有时间尝试下.NET Core。由于各种原因,就没有初试。刚好,前几天看到.NET Core发布新版本了,决定要去一探究竟。于是乎,就立马去官网查找相关的信息&…

Oracle入门(十四.4)之在PL / SQL中使用变量

一、变量的使用 (1)使用变量的原因•临时存储数据 •储存值的操作 •可重用性(2)处理PL / SQL中的变量变量是: •在声明部分声明并初始化 •在可执行部分中使用并分配新值 变量可以是: •作为参数传递给PL …

dismiss的词组_法律英语常用词必记:Dismiss

Dismiss英[dɪsmɪs] 美[dɪsmɪs]【英文释义】v.to refuse to give further hearing to a case in court. If a judge dismisses a court case, they officially decide that the case should not continue【中文释义】v. (1)解雇;免职;开除(2)驳回(起诉…

构建高性能.NET应用之配高可用IIS服务器-第五篇 IIS常见问题之:工作进程回收机制(中)

我们在本篇中接着讲述“工作进程回收机制”。 本篇文章的议题如下: 工作进程回收机制讲解 基于时间的回收机制 基于请求数的回收机制 基于内存使用的回收机制 基于活动状态的回收机制 基于请求数的回收机制 这种基于请求数量回收的机制非常的好理解:当我…

10.netty客户端与服务器使用protobuf传输报文

【README】 本文总结自B站《尚硅谷-netty》,很不错; 内容如下: netty的编码器与解码器;netty客户端与服务器通过 protobuf 传输报文的开发方式;文末po出了所有代码;【1】netty的编码器与解码器 codec 1&…

Oracle入门(十四.5)之识别数据类型

一、PL / SQL数据类型 数据类型指定存储格式,约束和有效的值范围。 PL / SQL支持五类数据类型:二、标量数据类型(Scalar) (1)标量数据类型•保持一个值 •没有内部组件 •可以分为四类: - 性格…

TFS2015的CI集成

这篇应该是这个系列的最后一篇了 配置生成代理 配置dotnet cli环境 这步,需要在生成代理的机器上配置cli环境,与本地配置方法一致,可以自行Google 下载及参考地址: https://www.microsoft.com/net/core#windows 配置环境变量 在生…

pivot sqlserver 条件_行转列之SQLSERVERPIVOT与用法详解

在数据库操作中,有些时候我们遇到需要实现“行转列”的需求,例如一下的表为某店铺的一周收入情况表:WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL)我们先插入一些模拟数据:INSERT INTO WEEK_INCOMESELECT 星期一,1000UNION ALLSE…

Oracle入门(十四.6)之使用标量数据类型

一、声明字符变量 字符数据类型包括CHAR,VARCHAR2和LONG。 DECLAREv_emp_job VARCHAR2(9);v_order_no VARCHAR2(6);v_product_id VARCHAR2(10);v_rpt_body_part LONG; …二、声明数字变量 数字数据类型包括NUMBER,PLS_INTEGER,BINARY_INTEGER…

11.netty入站与出站(处理器链调用机制)

【README】 1.本文源代码总结自 B站《netty-尚硅谷》;2.本文部分内容总结自 https://www.baeldung.com/netty3.本文主要介绍了通道管道中多个入栈处理器与多个出站处理器如何执行?并用代码演示执行顺序; 补充:文末附带了 log4j整…

1688推广工具_全面了解1688数字营销

全面了解1688数字营销什么是数字营销?在数字营销中,有一款很重要的工具-一键推广。在我们的日常经营和大促中,通过一键站外推广可以在各大站外平台实现全店、各产品的推广,尤其在大促中,结合活动当天的站内流量&#x…

Entity Framework升级

第三篇是Entity Framework升级 修改project.json 把原来 EntityFramework 的包 换成 Microsoft.EntityFrameworkCore 版本从 7.0.0-rc1-final 改为 1.0.0-rc2-final 对照表如下: RC1 PackageRC2 EquivalentEntityFramework.MicrosoftSqlServer 7.0.0-rc1-finalMicro…

12.netty中tcp粘包拆包问题及解决方法

【README】 1.本文源代码总结自B站《netty-尚硅谷》;2.本文介绍了tcp粘包拆包问题;3.本文po 出了粘包拆包问题解决方案及源代码实现;【1】tcp粘包拆包问题 refer2 How to deal with the problem of packet sticking and unpacking during T…

Oracle入门(十四.7)之良好的编程习惯

一、目的良好的编程实践是可以遵循的技术来创建最佳代码。 编程实践涵盖了从编写更易读的代码到创建具有更快性能的代码。软件工程团队通常会遵循风格指南,以便团队中的每个人都使用相同的技术。 这使得读取和修改其他人编写的代码变得更加容易。二、编程实践您已经…

css 浏览器调试中不可见_前端入门必会的初级调试技巧

本文仅仅针对前端初学者,目的是【用20%不到的时间】 学会【前端最常用的部分调试技巧】,如果需要最详细的调试技巧,包括调试性能优化的相关知识,文末会补充最全的文档(chrome devtool的官方文档链接)初学一…