netty源码分析之-SimpleChannelInboundHandler与ChannelInboundHandlerAdapter详解(9)
来源:互联网 发布:大学生旅游 知乎 编辑:程序博客网 时间:2024/05/29 19:10
每一个Handler都一定会处理出站或者入站(也可能两者都处理)数据,例如对于入站的Handler可能会继承SimpleChannelInboundHandler或者ChannelInboundHandlerAdapter,而SimpleChannelInboundHandler又是继承于ChannelInboundHandlerAdapter,最大的区别在于SimpleChannelInboundHandler会对没有外界引用的资源进行一定的清理,并且入站的消息可以通过泛型来规定。
对于两者关系:
public abstract class SimpleChannelInboundHandler<I> extends ChannelInboundHandlerAdapter
对于ChannelInboundHandlerAdapter的实现,会实现ChannelInboundHandler中的所有方法:
public class ChannelInboundHandlerAdapter extends ChannelHandlerAdapter implements ChannelInboundHandler
但是我们可能只会重写一些我们感兴趣的方法来处理数据,这里使用的是适配器模式
对于SimpleChannelInboundHandler中:
@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { boolean release = true; try { if (acceptInboundMessage(msg)) { @SuppressWarnings("unchecked") I imsg = (I) msg; channelRead0(ctx, imsg); } else { release = false; ctx.fireChannelRead(msg); } } finally { if (autoRelease && release) { ReferenceCountUtil.release(msg); } } } protected abstract void channelRead0(ChannelHandlerContext ctx, I msg) throws Exception;
因此我们继承SimpleChannelInboundHandler后,处理入站的数据我们只需要重新实现channelRead0方法,当channelRead真正被调用的时候我们的逻辑才会被处理。这里使用的是模板模式,让主要的处理逻辑保持不变,让变化的步骤通过接口实现来完成
值得注意的是对于SimpleChannelInboundHandler入站的数据,当被读取之后可能会执行ReferenceCountUtil.release(msg)释放资源。底层是实现ReferenceCounted,当新的对象初始化的时候计数为1,retain()方法实现其他地方的引用计数加1,release()方法实现应用减一,当计数减少到0的时候会被显示清除,再次访问被清除的对象会出现访问冲突。因此,当我们实现自己的Handler的时候如果希望将客户端发送过来的数据发送到客户端,可能在上述finally中已经释放了资源(writeAndFlush是异步处理),所以会出现异常情况。
- netty源码分析之-SimpleChannelInboundHandler与ChannelInboundHandlerAdapter详解(9)
- Netty 源码分析之SimpleChannelInboundHandler
- netty之SimpleChannelInboundHandler
- SimpleChannelInboundHandler和ChannelInboundHandlerAdapter区别
- SimpleChannelInboundHandler和ChannelInboundHandlerAdapter区别
- netty源码分析之-Channel与ChannelPipeline详解(6)
- netty源码分析之-ChannelHandler与ChannelContext详解(7)
- Netty框架SimpleChannelInboundHandler<T>主要方法详解
- Netty框架SimpleChannelInboundHandler<T>主要方法详解
- 一起学Netty(三)之 SimpleChannelInboundHandler
- 一起学Netty(三)之 SimpleChannelInboundHandler
- 一起学Netty(三)之 SimpleChannelInboundHandler
- ChannelInboundHandlerAdapter和SimpleChannelInboundHandler的使用区分
- Netty:ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter
- netty ChannelInboundHandlerAdapter 使用注意事项
- netty源码分析之-Future、ChannelFuture与ChannelPromise详解(4)
- netty源码分析之-ByteBuf详解以及与JDK中ByteBuffer差异(11)
- netty源码分析之-Channel注册流程详解(8)
- Qt学习
- Linux系统下安装Redis
- RxJava入门
- MOVSB指令详解
- 框架学习--shiro权限管理框架基础
- netty源码分析之-SimpleChannelInboundHandler与ChannelInboundHandlerAdapter详解(9)
- linux crontab命令 定时运行thinkphp链接 404 Not Found
- 【K-D树 在限制条件下求最近欧几里德距离】HDU
- HTML5 移动端 视口的相关问题
- Qt 4 学习笔记(一)
- poj 3280Cheapest Palindrome
- 设计模式的艺术之道--抽象工厂模式
- Spring
- SSH与SSM学习之SSH实现CRM练习17——添加客户拜访记录和列表