文档章节

netty的Sharable到底是干嘛用的

go4it
 go4it
发布于 2017/07/23 22:11
字数 777
阅读 9
收藏 0
点赞 0
评论 0

这里小结一下netty的一些知识点。

SimpleChannelInboundHandler

当某个ChannelInboundHandler的实现重写channelRead()方法时,它将负责显式地释放与池化的ByteBuf实例相关的内存。Netty为此提供了一个实用方法ReferenceCountUtil.release() 但是以这种方式管理资源可能很繁琐。

一个更加简单的方式是使用SimpleChannelInboundHandler。 由于SimpleChannelInboundHandler会自动释放资源,所以你不应该存储指向任何消息的引用供将来使用,因为这些引用都将会失效。

Sharable

标注一个channel handler可以被多个channel安全地共享。

ChannelHandlerAdapter还提供了实用方法isSharable()。如果其对应的实现被标注为Sharable,那么这个方法将返回true,表示它可以被添加到多个ChannelPipeline中。

因为一个ChannelHandler可以从属于多个ChannelPipeline,所以它也可以绑定到多个ChannelHandlerContext实例。用于这种用法的ChannelHandler必须要使用@Sharable注解标注;否则,试图将它添加到多个ChannelPipeline时将会触发异常。显而易见,为了安全地被用于多个并发的Channel(即连接),这样的ChannelHandler必须是线程安全的。

ChannelPipeline

ChannelPipeline是一个拦截流经Channel的入站和出站事件的ChannelHandler实例链。

每一个新创建的Channel都将会被分配一个新的ChannelPipeline。这项关联是永久性的;Channel既不能附加另外一个ChannelPipeline,也不能分离其当前的。在Netty组件的生命周期中,这是一项固定的操作,不需要开发人员的任何干预。 根据事件的起源,事件将会被ChannelInboundHandler或者ChannelOutbboundHandler处理。随后,通过调用ChannelHandlerContext实现,它将被转发给同一超类型的下一个ChannelHandler。

ChannelPipeline添加顺序

对于进站事件来说,先添加的先执行。 对于出站事件来说,后添加的先执行。

ChannelPipeline事件流转

将通过ChannelHandlerContext获取到Channel的引用。调用Channel上的write()方法将会导致写入事件从尾端到头部地流经ChannelPipeline:

ctx.getPipeline().write() 

要想调用从某个特定的ChannelHandler开始的处理过程,必须获取到在(ChannelPipeline)该ChannelHandler之前的ChannelHandler所关联的ChannnelHandlerContext。这个ChannelHandlerContext将调用和它所关联的ChannelHandler之后的ChannelHandler:

ctx.write()

消息将从下一个ChannelHandler开始流经ChannelPipeline,绕过了所有前面的ChannelHandler。

ChannelInitializer

netty提供了一种将多个ChannelHandler添加到一个ChannelPipeline中的简便方法。你只需要简单地向Bootstrap或ServerBootstrap的实例提供你的ChannelInitializer实现即可,并且一旦Channel被注册到了它的EventLoop之后,就会调用你的initChannel()版本。在该方法返回之后,ChannelInitializer的实例将会从ChannelPipeline中移除它自己。

在大部分的场景下,如果你不需要使用只存在于SocketChannel上的方法,使用ChannelInitializer就可以了,否则你可以使用ChannelInitializer,其中SocketChannel扩展了Channel。 如果你的应用程序使用了多个ChannelHandler,请定义你自己的ChannelInitializer实现来将它们安装到ChannelPipeline中。

© 著作权归作者所有

共有 人打赏支持
go4it
粉丝 50
博文 643
码字总数 434875
作品 0
深圳
Netty构建游戏服务器(三)--netty spring简单整合

一,基本方法 上节实现了netty的基本连接,这节加入spring来管理netty,由spring来开启netty服务。 在netty服务器中,我们建立了三个类:HelloServer(程序主入口) , HelloServerInitializ...

安世博 ⋅ 2016/09/14 ⋅ 2

netty 学习- channel代码相关注释

channelhandler / Handles an I/O event or intercepts an I/O operation, and forwards it to its next handler in its {@link ChannelPipeline}. <h3>Sub-types</h3> <p> {@link ChannelHa......

真爱2015 ⋅ 2016/03/05 ⋅ 0

Netty异步编程模型上的同步调用

Netty异步编程模型上的同步调用 Netty异步编程模型上的同步调用 看简单的一个小程序,说明什么是同步调用:所谓的同步调用就是调用一个方法,然后返回一个结果。(这个过程一直是阻塞的,直到...

秋风醉了 ⋅ 2014/06/20 ⋅ 0

netty4_is not a @Sharable handler

State management(handler的状态管理) A ChannelHandler often needs to store some stateful information. The simplest and recommended approach is to use member variables: public ......

秋风醉了 ⋅ 2014/07/28 ⋅ 2

第六章:ChannelHandler

本章介绍 ChannelPipeline ChannelHandlerContext ChannelHandler Inbound vs outbound(入站和出站) Netty提供了一个强大的处理这些事情的功能,允许用户自定义ChannelHandler的实现来处理数...

李矮矮 ⋅ 2016/09/26 ⋅ 0

netty业务处理多线程问题

现在实现了netty4的服务端,但是有些地方不甚理解,寻求帮助。 1、那个启动的时候设置的EventLoopGroup是干嘛用的。 2、我的业务处理是在这个自定义的Handler里面做。还是加到Disruptor的队列...

vikde ⋅ 2016/06/30 ⋅ 1

Netty实现自定义简单的编解码器(二)

Netty实现自定义简单的编解码器(二) 关于编解码器请参见:http://my.oschina.net/xinxingegeya/blog/282878 主要思路: 实现了一个IntegerEncoder编码器和一个IntegerDecoder解码器 服务器...

秋风醉了 ⋅ 2014/06/23 ⋅ 0

netty源码分析之服务端启动全解析

background netty 是一个异步事件驱动的网络通信层框架,其官方文档的解释为 Netty is a NIO client server framework which enables quick and easy development of network applications ......

️闪电侠 ⋅ 05/29 ⋅ 0

一.学习Netty之ChannelHandler接口

他的作用是处理一些io事件,或者阻止一些io操作,并且跳转到ChannelPipeline的下一个handler去 通常情况下,我们不会选择是实现这个接口,而是继承ChannelHandlerAdapter ChannelHandler 通常会提...

plugin ⋅ 2015/10/31 ⋅ 0

从github上面下载的angular,,我到底用哪个文件?

从github中下载了angular文件后,没有找到类似angular.js的文件. 都是sh文件,md文件,和不是angular.js的其他js文件. 请教大家,哪个文件是angular.js文件呢,还有就是github上下载 了那么多文件...

gogojxj ⋅ 2014/12/14 ⋅ 6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

AppDelegate 设置Root相关

self.window = UIWindow.init(frame: UIScreen.main.bounds) self.window?.backgroundColor = UIColor.white self.window?.makeKeyAndVisible() self.window?.rootViewController = RootTabB......

west_zll ⋅ 12分钟前 ⋅ 0

Java并发系列5--倒计时器CountDownLatch

今天讲一个倒计时器工具,叫CountDownLatch。需要这个工具的场景大概有:当所有的小任务都完成之后,再启动大任务。 先看代码: public class CountDownLatchDemo {static final CountDow...

大大枣 ⋅ 13分钟前 ⋅ 0

SpreadJS使用进阶指南 - 使用 NPM 管理你的项目

前言 SpreadJS作为一款性能出众的纯前端电子表格控件,自2015年发布以来,已经被广泛应用于各领域“在线Excel”数据管理项目中。NPM,作为管理Node.js库最有力的手段,解决了很多NodeJS代码部...

葡萄城控件技术团队 ⋅ 14分钟前 ⋅ 0

Mac下IntelliJ IDEA快捷键大全

https://blog.csdn.net/lisongjia123/article/details/54949364

细节探索者 ⋅ 17分钟前 ⋅ 0

建造者模式

1、工厂模式中创建的对象大都是简单的对象 复杂的产品类并且拥有不同的属性特点的管理就需要用到建造者模式 2、建造者模式: 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以...

职业搬砖20年 ⋅ 18分钟前 ⋅ 0

Mysql数据库开发 怎么优化SQL语句?

 1) 现场抓出慢查询语句 show full processlist;   2) 配置参数:   slow_query_log_file = ON 慢查询开启开关   long_query_time =2 记录大于2秒的sql语句   log_queries_not_usi...

老男孩Linux培训 ⋅ 19分钟前 ⋅ 0

Laravel 安装执行php artisan migrate 出现字段过长错误

最近在自己研究Laravel Laravel版本:5.6 PHP版本:7.1.9 Mysql版本:5.7.19 Apache版本:2.4.27 系统版本:windows10 首先要保证电脑安装了composer,和node.js 执行命令 composer global ...

Marhal ⋅ 24分钟前 ⋅ 0

ELK6.0日志从收集到处理完整版教程(二)

ELK简介 Elasticsearch 开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。也可以认为ElasticSearch是一...

bz_z ⋅ 27分钟前 ⋅ 0

Spark项目之电商用户行为分析大数据平台之(七)数据调研--基本数据结构介绍

目录 一、user_visit_action(Hive表) 1.1 表的结构 1.2 表的说明 二、user_info(Hive表) 2.1 表的结构 2.2 表的说明 三、task(MySQL表) 3.1 表的结构 3.2 表的说明 四、工作流程...

xiaomin0322 ⋅ 32分钟前 ⋅ 0

评分卡模型剖析之一(woe、IV、ROC、信息熵)

信用评分卡模型在国外是一种成熟的预测方法,尤其在信用风险评估以及金融风险控制领域更是得到了比较广泛的使用,其原理是将模型变量WOE编码方式离散化之后运用logistic回归模型进行的一种二...

火力全開 ⋅ 32分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部