返回顶部
首页 > 资讯 > 精选 >Netty分布式抽象编码器MessageToByteEncoder逻辑的示例分析
  • 811
分享到

Netty分布式抽象编码器MessageToByteEncoder逻辑的示例分析

2023-06-29 17:06:54 811人浏览 独家记忆
摘要

小编给大家分享一下Netty分布式抽象编码器MessageToByteEncoder逻辑的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MessageTo

小编给大家分享一下Netty分布式抽象编码器MessageToByteEncoder逻辑的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

MessageToByteEncoder

同解码器一样, 编码器中也有一个抽象类叫MessageToByteEncoder, 其中定义了编码器的骨架方法, 具体编码逻辑交给子类实现

解码器同样也是个handler, 将写出的数据进行截取处理, 我们在学习pipeline中我们知道, 写数据的时候会传递write事件, 传递过程中会调用handler的write方法, 所以编码器码器可以重写write方法, 将数据编码成二进制字节流然后再继续传递write事件

首先看MessageToByteEncoder的类声明

public abstract class MessageToByteEncoder<I> extends ChannelOutboundHandlerAdapter{    //省略类体}

这里继承ChannelOutboundHandlerAdapter, 说明是个outBoundhandler, 我们知道write事件是个outBound事件, 而outBound事件只能通过outBoundHandler进行传输

write事件传播过程中要调用handler的write方法

我们跟到MessageToByteEncoder的write方法中:

public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {    ByteBuf buf = null;    try {        if (acceptOutboundMessage(msg)) {            @SuppressWarnings("unchecked")            I cast = (I) msg;            buf = allocateBuffer(ctx, cast, preferDirect);            try {                encode(ctx, cast, buf);            } finally {                ReferenceCountUtil.release(cast);            }            if (buf.isReadable()) {                ctx.write(buf, promise);            } else {                buf.release();                ctx.write(Unpooled.EMPTY_BUFFER, promise);            }            buf = null;        } else {            ctx.write(msg, promise);        }    } catch (EncoderException e) {        throw e;    } catch (Throwable e) {        throw new EncoderException(e);    } finally {        if (buf != null) {            buf.release();        }    }}

首先通过 if (acceptOutboundMessage(msg)) 判断当前对象是否可处理

如果可处理, 则进入if块中的逻辑, 如果不能处理, 则进入else块, 通过ctx.write(msg, promise)继续传递write事件

我们看if块中

 I cast = (I) msg 这里是强制类型转换, 转换成I类型, I类型是个泛型, 具体类型由用户定义

 buf = allocateBuffer(ctx, cast, preferDirect) 这里进行缓冲区分配

跟到allocateBuffer方法中

protected ByteBuf allocateBuffer(ChannelHandlerContext ctx, @SuppressWarnings("unused") I msg,                            boolean preferDirect) throws Exception {    if (preferDirect) {        return ctx.alloc().ioBuffer();    } else {        return ctx.alloc().heapBuffer();    }}

这里会直接通过ctx的内存分配器进行内存分配, 通过判断preferDirect来分配堆内存或者堆外内存, 默认情况下是分配堆外内存

有关内存分配, 我们之前已经做过相关的剖析

回到write方法中:

内存分配结束之后会调用encode(ctx, cast, buf)方法进行编码, 该类由子类实现

子类可以通过继承该类, 重写encode方法, 将参数对象cast编码成字节写入到传入的ByteBuf中, 就完成了编码工作

编码完成后后, 会通过ReferenceCountUtil.release(cast)将cast对象释放

 if (buf.isReadable()) 这里判断buf是否有可读字节, 如果有可读字节, 则继续传递write事件

如果没有可读字节, 则将buf进行释放, 继续传播write事件, 传递一个空的ByteBuf

最后将buf设置为空

以上是“Netty分布式抽象编码器MessageToByteEncoder逻辑的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Netty分布式抽象编码器MessageToByteEncoder逻辑的示例分析

本文链接: https://lsjlt.com/news/325904.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Netty分布式抽象编码器MessageToByteEncoder逻辑的示例分析
    小编给大家分享一下Netty分布式抽象编码器MessageToByteEncoder逻辑的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MessageTo...
    99+
    2023-06-29
  • Netty分布式抽象编码器MessageToByteEncoder逻辑分析
    目录MessageToByteEncoder首先看MessageToByteEncoder的类声明跟到allocateBuffer方法中前文回顾:Netty分布式编码器及写数据事件处...
    99+
    2024-04-02
  • Netty分布式编码器写buffer队列逻辑剖析
    目录写buffer队列我们跟到AbstractUnsafe的write方法中回到write方法中我们跟到setUnwritable(invokeLater)方法中前文传送门:抽象编码...
    99+
    2024-04-02
  • Netty分布式行解码器逻辑源码解析
    目录行解码器LineBasedFrameDecoder首先看其参数我们跟到重载的decode方法中我们看findEndOfLine(buffer)方法前文传送门:Netty分布式固定...
    99+
    2024-04-02
  • Netty分布式ByteBuf使用的回收逻辑剖析
    目录ByteBuf回收这里调用了release0, 跟进去我们首先分析free方法我们跟到cache中回到add方法中我们回到free方法中前文传送门:ByteBuf使用subPag...
    99+
    2024-04-02
  • Netty分布式解码器读取数据不完整的逻辑剖析
    目录概述第一节: ByteToMessageDecoder我们看他的定义我们看其channelRead方法我们看cumulator属性我们回到channRead方法中概述 在我们上一...
    99+
    2024-04-02
  • Netty分布式FastThreadLocal的set方法实现逻辑剖析
    目录FastThreadLocal的set方法实现线程set对象我们跟到setIndexedVariable中我们跟进removeIndexedVariable方法上一小节我们学习了...
    99+
    2024-04-02
  • Netty分布式固定长度解码器的示例分析
    这篇文章主要为大家展示了“Netty分布式固定长度解码器的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Netty分布式固定长度解码器的示例分析”这篇文章吧。固定长度解码器我们了解到, ...
    99+
    2023-06-29
  • Netty分布式pipeline管道传播事件的逻辑总结分析
    目录问题分析首先看第一个问题我们看一下ChannelInitializer这个类的继承关系回到callHandlerCallbackLater方法中紧接着我们看第二个问题章节总结我们...
    99+
    2024-04-02
  • Nett分布式分隔符解码器逻辑源码剖析
    目录分隔符解码器我们看其中的一个构造方法我们跟到重载decode方法中我们看初始化该属性的构造方法章节总结前文传送门:Netty分布式行解码器逻辑源码解析 分隔符解码器 基于分隔符解...
    99+
    2024-04-02
  • Netty分布式监听读事件的示例分析
    小编给大家分享一下Netty分布式监听读事件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我们回到AbstractUnsafe的register0()方...
    99+
    2023-06-29
  • Oracle逻辑读的示例分析
    这篇文章给大家分享的是有关Oracle逻辑读的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.物理读(physical read)当数据块第一次读取到,就会缓存到buf...
    99+
    2024-04-02
  • Netty分布式Future与Promise执行回调相关逻辑剖析
    目录Future和Promise执行回调首先我们看一段写在handler中的业务代码这里关注newPromise()方法, 跟进去我们继续跟write方法跟进tryFailure方法...
    99+
    2024-04-02
  • Netty分布式pipeline管道Handler的删除逻辑操作
    目录删除handler操作我们跟到getContextPrDie这个方法中首先要断言删除的节点不能是tail和head回到remove(ctx)方法上一小节我们学习了添加handle...
    99+
    2024-04-02
  • Netty分布式ByteBuf使用的回收逻辑是什么
    这篇文章主要介绍“Netty分布式ByteBuf使用的回收逻辑是什么”,在日常操作中,相信很多人在Netty分布式ByteBuf使用的回收逻辑是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Netty分布...
    99+
    2023-06-29
  • Netty分布式解码器读取数据不完整的逻辑是什么
    这篇文章将为大家详细讲解有关Netty分布式解码器读取数据不完整的逻辑是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。概述如果Server在读取客户端的数据的时候, 如果一次读取不完整, 就触发cha...
    99+
    2023-06-29
  • Netty分布式编码器及写数据事件处理使用场景的示例分析
    这篇文章主要介绍Netty分布式编码器及写数据事件处理使用场景的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!编码器第一节: writeAndFlush的事件传播我们之前在学习pipeline的时候...
    99+
    2023-06-29
  • Mysql逻辑架构的示例分析
    小编给大家分享一下Mysql逻辑架构的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 整体架构图和其它数据库相比,M...
    99+
    2024-04-02
  • Netty分布式NioSocketChannel注册到selector方法的示例分析
    这篇文章给大家分享的是有关Netty分布式NioSocketChannel注册到selector方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我们回到最初的NioMessageUnsafe的read...
    99+
    2023-06-29
  • 抽象类Abstract的示例分析
    这篇文章将为大家详细讲解有关抽象类Abstract的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.定义:抽象类,使用abstract关键字修饰的类,表示该类只能被继承,不能被实例化。2.基本语...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作