释放资源
当Channel处理完后,一定记得调用close()或者close(ChannelPromise)来释放资源 。
5. channelFuture
channelFuture是异步IO操作的返回值 。
在Netty中所有的IO操作都是异步的 。这意味着所有的IO调用将立即返回,但不保证在调用结束时请求的IO操作都已经执行完毕 。而是在请求操作处理完成、失败或者取消时返回一个ChannelFuture来通知 。
当一个IO操作开始时,创建一个新的future 。ChannelFuture要么是uncompleted,要么是completed 。新的future开始时是uncompleted---既不是成功、失败,也不是取消,因为IO操作还没有开始呢 。若IO操作结束时future要么成功,要么失败或者取消,标记为completed的future有更多特殊的意义,例如失败的原因 。请注意:即使失败和取消也属于completed状态 。
文章插图
有很多方法可以查询IO操作是否完成:等待完成,检索IO操作的结果 。同样也允许你增加ChannelFutureListenner,这样你可以在IO操作完成后获得通知 。
在尽可能的情况下,推荐addListenner()方法而不是await()方法,当IO操作完成后去完成接下来的其它任务时去获取通知 。
6.ChannelHandlerContext
对ChannelHandler相关信息的包装 。
小结
netty处理请求的总流程是经过ChannelPipeline中的多个ChannelHandler后,返回结果ChannelFuture 。如下图所示:
文章插图
具体I/O操作调用的流程,
应用->Channel的I/O操作->调用Pipeline相应的I/O操作->调用ChannelHandlerContext的相应I/O操作->调用ChannelHandler的相应操作->Channel.UnSafe中相关的I/O操作 。
应用为什么不直接调用Channel.UnSafe接口中的I/O操作呢,而要绕一个大圈呢?因为它是框架,要支持扩展 。
执行者完成操作后,是如何通知命令者的呢?一般流程是这样的:
Channel.UnSafe中执行相关的I/O操作,根据操作结果->调用ChannelPipeline中相应发fireXXXX()接口->调用ChannelHandlerContext中相应的fireXXXX()接口->调用ChannelHandler中相应方法->调用应用中的相关逻辑 。
参考文献:
【1】http://www.jiancool.com/article/71493268111/
【2】http://blog.csdn.net/pingnanlee/article/details/11973769
推荐阅读
- Redis主从复制机制详解
- 好茉莉茶多少钱斤 好茉莉花茶可以从它的种类来选择
- 招聘|国家体育总局2022事业单位招聘应届毕业生报考情况分析
- 春茶和秋茶的区别
- 什么面料的衣服看起来高档 衣服面料档次从高到低
- 买苹果、华为、OV还是小米?听完手机店老板的分析,谜团解开了
- 绿茶用开水泡 大错特错
- 冬季喝什么茶对身体好?红枣茶蜂蜜菊花茶
- MySQL数据库性能优化之thread pool 原理分析,值得收藏
- 梦见有人从楼上掉下去摔死了满地血 梦见有人从楼上掉下去摔死了周公解梦