10. 成功解决:io.netty.channel.ChannelPipelineException: ***Handler is not a @Sharable handler, so can't be added or removed multiple times.

简介: 使用 SpringBoot 集成 Netty 时,报如下错误:io.netty.channel.ChannelPipelineException: ***Handler is not a @Sharable handler, so can't be added or removed multiple times.

8b6d6bba21332fef2a9927834e454b88_image_auth_key=1686704139-gAx4zSWSibzxX1ZHNdu7At-0-98cea666149119a7d8b60ce273115188&file_size=332738.png

❤️ 个人主页: 水滴技术
🌸 订阅专栏: 成功解决 BUG 合集
🚀 支持水滴: 点赞👍 + 收藏⭐ + 留言💬

问题描述

使用 SpringBoot 集成 Netty 时,报如下错误:

io.netty.channel.ChannelPipelineException: ***Handler is not a @Sharable handler, so can't be added or removed multiple times.
  at io.netty.channel.DefaultChannelPipeline.checkMultiplicity(DefaultChannelPipeline.java:600) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:202) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:381) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at ***ChannelInitializer.initChannel(GeneralChannelInitializer.java:27) ~[classes/:na]
  at ***ChannelInitializer.initChannel(GeneralChannelInitializer.java:15) ~[classes/:na]
  at io.netty.channel.ChannelInitializer.initChannel(ChannelInitializer.java:129) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.ChannelInitializer.handlerAdded(ChannelInitializer.java:112) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.AbstractChannelHandlerContext.callHandlerAdded(AbstractChannelHandlerContext.java:938) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:609) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.DefaultChannelPipeline.access$100(DefaultChannelPipeline.java:46) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.DefaultChannelPipeline$PendingHandlerAddedTask.execute(DefaultChannelPipeline.java:1463) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.DefaultChannelPipeline.callHandlerAddedForAllHandlers(DefaultChannelPipeline.java:1115) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.DefaultChannelPipeline.invokeHandlerAddedIfNeeded(DefaultChannelPipeline.java:650) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:514) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.util.concurrent.AbstractEventExecutor.runTask$$$capture(AbstractEventExecutor.java:174) [netty-common-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java) [netty-common-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:167) [netty-common-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) [netty-common-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) [netty-common-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569) [netty-transport-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) [netty-common-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-common-4.1.82.Final.jar:4.1.82.Final]
  at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.82.Final.jar:4.1.82.Final]
  at java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]

原因分析

错误信息的意思是自定义的 Handler 不是 @Sharable ,所以不能多次添加或删除。这是为什么呢,看了下源码找到了答案。

66d2f218b680b84a2f191e7a8fa54226_image_auth_key=1686704155-312YhTxUGPqLmPkPN9Wqyz-0-78de83f76fcac094ab112972af2dc1ac&file_size=59402.png

注释的大体意思是:

可以将带该注释的 ChannelHandler 的同一个实例多次添加到一个或多个 ChannelPipeline ,而不存在竞争条件。
如果未指定该注解,每次添加 ChannelPipeline 时必须创建一个新的 ChannelHandler实例,因为它具有成员变量等非共享状态。

解决方案

有两种解决方案:

方案一:增加@ChannelHandler.Sharable 注解

在自定义的 Handler 上增加 @ChannelHandler.Sharable 注解。

81e8147e23d6fed66562a542ded99c89_image_auth_key=1686704173-v36TgXiYM6UNsCyBwXoSg1-0-f546dbd9650e8572cb36820b809ab761&file_size=10877.png

方案二:

在 pipelin 中改为 new 创建实例。

2daa1b8d32e5424f10a5033bb67e822e_image_auth_key=1686704185-31z6CXkFhtwJAYWMJAFo4B-0-2316ca4fd7c5cc5f73b776454a9567c2&file_size=65753.png


热门专栏

👍 《Java 教程:从入门到精通

👍 《MySQL 教程:从入门到精通

相关文章
|
4月前
|
设计模式 前端开发 数据安全/隐私保护
网络编程的魔法师:探索Netty中Handler的奇妙世界
网络编程的魔法师:探索Netty中Handler的奇妙世界
48 0
|
11月前
04RPC - netty中handler的执行顺序
04RPC - netty中handler的执行顺序
74 0
|
前端开发 算法 Java
Netty组件Future、Promise、Handler、Pipline、ByteBuf
Netty组件Future、Promise、Handler、Pipline、ByteBuf
141 0
|
存储 Java
Netty网络编程(四):Event、Handler和Pipeline
Netty网络编程(四):Event、Handler和Pipeline
112 0
|
缓存 移动开发 网络协议
第 8 章 Netty 编解码器和 Handler 调用机制
第 8 章 Netty 编解码器和 Handler 调用机制
163 0
|
网络协议 算法
小六六学Netty系列之编解码器和handler的调用机制(下)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
140 0
|
存储 编解码 网络协议
小六六学Netty系列之编解码器和handler的调用机制(上)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
219 0
|
存储 Java
netty系列之:Event、Handler和Pipeline
netty系列之:Event、Handler和Pipeline
netty系列之:Event、Handler和Pipeline
|
关系型数据库 MySQL 应用服务中间件
tomcat链接mysql时超时报错java.io.EOFException: Can not read response from server. Expected to read 4 bytes,
需要在配置文件里加上下面就ok了 http://blog.csdn.net/zhq426/article/details/9787071/
2631 0
|
Java
java.io.IOException: Can't read [proguard.ClassPathEntry@5ef04b5] (Can't process class [WEB-INF/clas
版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcs_dn/article/details/45623211 ...
1232 0