这篇文章主要介绍了Netty分布式抽象编码器MessageToByteEncoder的抽象逻辑分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
综述:Netty分布式编码器和写数据事件的处理
MessageToByteEncoder
和解码器一样,编码器中有一个抽象类叫做MessageToByteEncoder,其中定义了编码器的骨架方法,具体的编码逻辑交给子类实现。
解码器也是一个处理程序,它截取写入的数据。我们在管道中知道,写数据时会传递write事件,在传输过程中会调用处理程序的write方法,所以编码器可以重写write方法,将数据编码成二进制字节流,然后继续传递write事件。
首先看MessageToByteEncoder的类声明public abstract class MessageToByteEncoderlt;Igt; extends ChannelOutboundHandlerAdapter{ //省略类体}
这里,ChannelOutboundHandlerAdapter被继承,表明它是一个outBoundhandler。我们知道write事件是一个出站事件,出站事件只能通过outBoundHandler传输。
在write事件的传播过程中调用handler的write方法。
让我们遵循MessageToByteEncoder的编写方法:
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(acceptouboundmessage(msg))用于确定当前对象是否可以被处理。
如果可以处理,就进入If块中的逻辑;如果不能处理,就进入else块,继续通过ctx.write(msg,promise)传递write事件
让我们看看if块
I cast = (I) msg这里是强制类型转换,转换为I类型,I类型是泛型类型,具体类型由用户定义。
Buff = allocate buffer (CTX,cast,prefererdirect)在这里,执行缓冲区分配。
跟到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来分配堆内内存或者堆外内存,这是默认的。
关于内存分配,我们之前做过相关分析。
回到写方法:
内存分配后会调用encode(ctx,cast,buf)方法进行编码,这个类是由子类实现的。
一个子类可以继承这个类,重写encode方法,将参数对象cast编码成字节,写入传入的ByteBuf,从而完成编码工作。
编码后,cast对象将通过referencecountutil . release(cast)释放
这里的If(buf.isReadable())判断buf是否有可读字节,如果有,继续传递写事件。
如果没有可读字节,缓冲区将被释放,写事件将继续传播,并将传递空的字节缓冲区。
最后,将buf设置为空
以上是抽象编码器的抽象逻辑,具体编码逻辑需要它的子类。更多关于Netty分布式抽象编码器MessageToByteEncoder的信息,请关注搜源网其他相关文章!
查看更多关于网状分布式抽象编码器MessageToByteEncoder的逻辑分析的详细内容...