关于netty的@Sharable注解含义,你可bie瞎说了
@Sharable的真实含义
1.当netty尝试往多个channel的pipeline中添加同一个ChannelHandlerAdapter实例时,会判断该实例类是否添加了@Sharable,没有则抛出... is not a @Sharable handler, so can't be added or removed multiple times异常
如果你添加的不是单例Handler,你加不加@Sharable没有任何区别
如果你添加的是单例Handler,只要它会被添加到多个channel的pipeline,那就必须加上@Sharable
2.网上有些资料说netty会将注解了@Sharable的Handler单例化,实在误导人。channelHandler是不是单例跟netty没有任何关系,netty只会在你尝试用单例ChannelHandler时加上第1条说明的限制,这个限制意思很明确,多个channel公用单例ChannelHandler,那它就必须是线程安全的,@Sharable就是用于告诉netty,我这个Handler是线程安全的,可以被多个channel安全的share,假如你搞了个线程不安全的类,你对它用上了单例,还加个@Sharable,这时候netty拿你也没办法,只是你的老板可能会有点不开心
一般情况下,我们的代码是这样:
bootstrap.childHandler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast(new ShareTestChannelHandler());
};
});
在initChannel方法中,我们addLast传入的Handler实例,他是不是单例的与netty没有任何关系,和你是否注解@Sharable也没有任何关系
就拿上面的代码说,它就不是单例的,每次都是new一个新对象,这时候你加不加@Sharable没有任何区别
如果,你传入一个单例的Handler对象,只要它会被添加到多个channel的pipeline链中,那它就必须是@Sharable的,不然就抛出第1点说的异常:
bootstrap.childHandler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast(ShareTestChannelHandler.INSTANCE);
};
});
@Sharable
public class ShareTestChannelHandler extends SimpleChannelInboundHandler<ByteBuf>
public static ShareTestChannelHandler INSTANCE = new ShareTestChannelHandler();
private ShareTestChannelHandler() {}
......
}
那是不是所有Handler都可以加上@Sharable呢?
不是,netty中,解码器有关的Handler都是不安全的,因为粘包拆包的缘故,Decoder必须要保存一些解析过程的中间状态,比如ByteToMessageDecoder类中维护的一个字节累加器cumulation,每次读到当前channel的消息后都会将消息累加到cumulation中,然后再调用子类实现的decode方法。
所以它不能被多个channel安全的共享,netty明确的禁止了使用单例Decoder,即使你自作聪明的给他加上@Sharable,也会被禁止掉,抛出... is not allowed to be shared错误,所以我们在添加Decoder时,1必须不是单例,2不要添加@Sharable
关于netty的@Sharable注解含义,你可bie瞎说了相关推荐
- spring AOP注解含义
spring AOP 的几个注解含义 @Aspect 指定一个类为切面类 @P ...
- @aspect注解类不生效_Spring Boot从入门到精通(三)常用注解含义及用法分析总结...
Spring Boot是目前非常流行的框架,而注解是Spring Boot的核心功能,接下来主要说一说Spring Boot常用注解的含义以及部分注解在项目中的使用方法. @RestControlle ...
- HystrixCommand注解含义
public interface HystrixCommand {// HystrixCommand 命令所属的组的名称:默认注解方法类的名称String groupKey() default &qu ...
- @Deprecated注解 含义及用途
@Deprecated注解 @Deprecated注解说明 用途 @Deprecated注解说明 表示此方法已废弃.暂时可用,但以后此类或方法都不会再更新.后期可能会删除,建议后来人不要调用此方法. ...
- 网络编程(四):Netty
简述 基于Netty的知名项目 数据库:Cassandra 大数据处理:Spark.Hadoop 消息中间件:RocketMQ 检索:Elasticsearch 框架:gRPC.Apache Dubb ...
- Netty @Sharable的使用
一.@Sharable的真实含义 当netty尝试往多个channel的pipeline中添加同一个ChannelHandlerAdapter实例时,会判断该实例类是否添加了@Sharable,没有则 ...
- Netty中重连可能出现 is not a @Sharable handler 报错的处理方法
netty重连报错 场景描述 问题分析 处理方法 补充说明 参考连接: 场景描述 采用netty时进行udp的连接,代码如下,初始连接正常,当网络进行重连时就开始报错:is not a @Sharab ...
- SpringBoot注解@Component、Repository、Service、Controller的含义
注解 含义 @Component 最普通的组件,可以被注入到spring容器进行管理 @Repository 作用于持久层 @Service 作用于业务逻辑层 @Controller 作用于表现层(s ...
- @Component注解的含义
"无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点人工智能教程可以跳转到教程. 一.注解 ...
最新文章
- 突发奇想写的一篇小科幻(如果可以叫做科幻的话)
- 性能案例-Linux下解决time_wait连接过多(Linux内核优化)
- 给PUBG Mobile打上几十个数据标签解析霸榜原因
- 新闻发布项目——访问温馨提示
- Arduino笔记-呼吸流水灯
- linux vi设置技巧,vi 技巧
- HDU4508 完全背包
- CentOS 7.5 重置 root 密码
- Spark standalone运行模式(图文详解)
- BroadCastReceive的理解和使用
- android 7.1 灭屏,oppocolorosv7.1怎么设置息屏时钟
- endnoteX9英文参考文献格式下载和导入
- 高通骁龙888开始被Linux内核5.12版正式支持
- 使用ps修改图片大小不影响清晰度的方法
- 基于LabVIEW的WIFI通信人机交互界面设计
- 抖音常见的十种变现方式
- 《迅雷链精品课》第四课:区块链技术的发展趋势
- 奇安信Java后端一面
- Photoshop 中的彩蛋
- 全球地形起伏模型ETOPO1
热门文章
- 区块链是什么意思?区块链的概念及特点
- for循环的学习心得
- 关于c++中的一个母牛生小牛的问题详细解答与体会
- Android App屏幕旋转要点
- Ultraiso制作Centos7 优盘Udisk 启动镜像
- c#等比例缩放、压缩gif、动图文件
- How to Install Cinnamon Desktop on Ubuntu
- php做到聊天发图片,网页聊天框发送表情图片实现方法
- 计算机临床医学自动化哪个好,这五个专业待遇高,就业好,但是很难学,挂科风险大,选择要慎重...
- 史密斯探测证实,BioFlash可检出空气中的SARS-CoV-2变异株,包括德尔塔和德尔塔+