文档章节

netty的Sharable到底是干嘛用的

go4it
 go4it
发布于 2017/07/23 22:11
字数 777
阅读 11
收藏 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
粉丝 52
博文 702
码字总数 503295
作品 0
深圳
Netty构建游戏服务器(三)--netty spring简单整合

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

安世博
2016/09/14
4K
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
77
0
Netty异步编程模型上的同步调用

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

秋风醉了
2014/06/20
0
0
第六章:ChannelHandler

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

李矮矮
2016/09/26
24
0
Netty实现自定义简单的编解码器(二)

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

秋风醉了
2014/06/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ在CentOS环境安装

1.废话不多说准备一台虚拟机,系统为centos,我这里使用的系统版本如下图所示:

凌晨一点
48分钟前
0
0
线程池相关

在java.util.concurrent包下,提供了一系列与线程池相关的类。 使用线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 提高响应速度。当任务到达时,任务...

edwardGe
50分钟前
0
0
学习大数据这三个关键技术是一定要掌握!

大数据时代全面来临,大数据、人工智能等技术引领科技创新潮流,获得国家政策大力支持,前景广阔。学习大数据技术的人自然是络绎不绝, 学习大数据虽然是一个趋势,但也要注意大数据培训课程...

董黎明
今天
0
0
jetbrains 上传代码到github

设置中找github 获取token 验证是否成功 测试git 生成key,一路回车即可 ssh-keygen -t rsa -C “youremail@example.com” 打开pub复制key,需要再次输入一次密码 验证是否成功,输入yes即可...

阿豪boy
今天
0
0
分布式服务框架(拾遗)

前言 现在的大部分工程都已经是基于分布式架构来处理。所以这里对分布式框架做一个简单的总结 常用的RPC框架 RPC框架原理 RPC(Remote Procedure Call,远程过程调用)一般用来实现部署在不同...

kukudeku
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部