首页 > 其他分享 >Netty出现的异常【已解决】:An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It

Netty出现的异常【已解决】:An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It

时间:2024-12-18 16:33:26浏览次数:3  
标签:Netty pipeline 一次 handle 引用 ByteBuf retain

  • 修改方案:
    byteBuf.retain(); ByteBuf后面添加这个retain(),这个添加原则是这样,如果你消耗了一次ByteBuf,你的下游Handler还需要再次消耗的话,就需要添加这个retain(),以此类推,一定要要注意添加的时机,不然的话可能需要自己手动释放;

  • 原因分析:这个错误是因为ByteBuf的已经被逻辑释放了,重复释放导致的;Netty为了防止内存泄漏,使用引用计数的方式计算;这个引用计数一般再ByteBuf创建的时候会有一次,任何一次的读,写操作都会导致引用数-1;其次,Netty本身也提供了对ByteBuf的自动回收机制,所以这样的话,如果不注意,很容易出现这个错误;这个retain就会增加一次引用;回到我自己的项目案例:

    • 我创建了一个顶级的父类NioWebSocketFrameHandler,用来处理WebSocketFrame数据帧数据,进行最初的数据分发处理;下面是比较关键的方法:

    • 这里我将数据投递到下一个handler,这里会消耗一次ByteBuf;(所以理论上这里的ByteBuf是可以被回收了);我们继续看下一个处理器,用来处理二进制的数据帧,红框框的位置就是出现异常的位置

    • 前面我们说过,ByteBuf的每一次读取都会消耗一次引用,再上游的时候,就已经消耗了一次引用,而ByteBuf的引用是整个Pipeline共享的,所以这里的ByteBuf肯定是不能再引用数-1操作的,引用数已经是0了(这个操作是netty自动完成的),所以就出现了异常错误;

  • 最后补充一句,当Bytefue引用数为0的时候,Netty会自动回收,所以有时候会出现空指针异常,也是这个原因;源码分析就这里就不分析了,感兴趣的可以去看看;

标签:Netty,pipeline,一次,handle,引用,ByteBuf,retain
From: https://www.cnblogs.com/lidachui/p/18615109

相关文章

  • Netty网络框架详细讲解
    一、Netty基本内容1.什么是netty?Netty是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。异步的:事件驱动:基于JavaNIO(Non-blockingI/O)的Selector实现的。Netty的核心设计目标是:高性能:充分利用JavaNIO的非阻塞特性。可扩......
  • MyBatis 类型处理器(typeHandlers),处理枚举类型,对象工厂(objectFactory)
    类型处理器(typeHandlers)MyBatis在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成Java类型。下表描述了一些默认的类型处理器。提示从3.4.5开始,MyBatis默认支持JSR-310(日期和时间API)。类型处......
  • 【Netty】IO模型
    官方参考:https://gee.cs.oswego.edu/dl/cpjslides/nio.pdf 1)BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理,线程开销大。2)NIO:一个请求一个线程,客户端发送的连接请求会注册到多路复用器上,多路复用器轮询到该连接有I/O请求时才启动一个线程进行处理......
  • Pipelines 进阶
    pipelines_advanced-Copy1  Pipelines进阶¶以下任务:使用Pipeline如何与现代的大语言模型结合,以完成各类下游任务使用Tokenizer编解码文本使用Models加载和保存模型  使用Pipeline调用大语言模型¶LLM¶两种典型的语言模型:自回归:模......
  • STM32卡死、跑飞、进入HardFault_Handler如何精准的确定问题
    目录前言一、程序跑飞原因软件原因1.堆栈溢出2.指针操作错误3.中断优先级配置错误4.外设错误配置5.存储器管理问题6.代码逻辑错误7.时钟配置错误8.Watchdog超时硬件原因1.电气问题2.硬件故障软件复位与硬件问题结合二、调试工具如何进入仿真?进入......
  • lang.IllegalStateException_ Type handler was null on parameter mapping for prope
    在使用mybatis-plus的removeIds()方法时抛出此异常。在调用的时候传入了实体类对象的list的集合使用id的集合即可List<PojoInfo>totalList;//错误用法service.removeByIds(totalList);//正确用法List<Long>idList=totalList.stream().map(PojoInfo::getId).collec......
  • Crashpad Handler 进程是与 Crashpad 系统相关的一个后台进程,Crashpad 本身是一个 崩
    CrashpadHandler进程CrashpadHandler进程是与Crashpad系统相关的一个后台进程,Crashpad本身是一个崩溃报告和分析工具,广泛用于许多应用程序中,尤其是GoogleChrome、Electron等浏览器和桌面应用程序。Crashpad的作用和工作原理:Crashpad 主要用于捕捉应用程序崩溃时......
  • Transformers 框架 Pipeline 任务详解(三):词元分类(token-classification)和命名实体识别
    微信公众号:老牛同学公众号标题:Transformers框架Pipeline任务详解(三):词元分类(token-classification)和命名实体识别公众号链接:https://mp.weixin.qq.com/s/r2uFCwPZaMeDL_eiQsEmIQ在自然语言处理(NLP)领域,Token-Classification(词元分类)任务是一项关键的技术,这项技术广泛应用于......
  • 自动化处理: Unhandled exception. System.IO.IOException: The configured user limit
    #!/bin/bash#设置root密码为环境变量exportROOT_PASSWORD="your_root_password_here"#检查是否以普通用户运行if["$EUID"-eq0];thenecho"不要以root权限直接运行此脚本"exitfi#打印当前的max_user_instances值echo"当前的max_user_instances值:"su......
  • C#自动化处理: Unhandled exception. System.IO.IOException: The configured user lim
    usingSystem;usingSystem.Diagnostics;classProgram{//定义root密码(请用你的实际密码替换)privateconststringRootPassword="your_root_password_here";staticvoidMain(){try{//需要执行的命令列表......