Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)
标签: Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析) JavaScript博客 51CTO博客
2023-05-17 18:24:09 175浏览
一、问题背景:
最近某springboot项目想嵌入一个用户聊天功能,打算使用 Rabbitmq + Netty4.x + Redis 来开发高性能聊天功能。花费三天时间所有功能都已实现。启动时却警告 :Unknown channel option 'xxxx' for channel '[id: 0xba18fac1]', 虽然是个告警但是必须解决,否则会影响正在准备建立连接的握手以及激活心跳机制->TCP自动发送一个活动探测数据报文

netty 使用的版本是 4.1.6
二、源码分析
1、serverBootstrap绑定处打断点,准备进入函数

2、一路跟进

3、channel.config().setOption() 进入 DefaultServerSocketChannelConfig 的实现类 NioServerSocketChannelConfig 的 setOption()

代码逻辑:首先会判断Java JDK版本是否 >= 7, 并且 ChannelOption 是否是 NioChannelOption 及其父类的一个实例。再从NioOption中查找key-value对,如果没有找到,就会去JDK的Option中去查找,如果仍然没找到,那么就会报出警告。
然而 option instanceof NioChannelOption 不成立,所有走 super.setOption(option, value), 回到父类 DefaultServerSocketChannelConfig 中去查找:

还是没有可以与 SO_KEEPALIVE 和 TCP_NODELAY 匹配的,继续往父类 DefaultChannelConfig 找:

还是没有,返回 false,最后弹出 log 警告: Unknown channel option 'xxxx' for channel '[id: 0xba18fac1]',

这下我们理清了为什么会发出警告。通过上述分析,我还是没有发现有什么问题…

4、想着不妨去看下官方 netty 4.1 的源代码对比一下。好家伙,一看发现怎么和我的源代码完全不一样…


三、问题解决:
从上述分析可以看出,大概率是 pom 导入的依赖有冲突,我的 netty 4.1.6 被覆盖了,使用 Maven Helper 查询一波 netty 依赖关系:

发现 Lettuce (Redis的Java驱动包) 底层通信框架就是 Netty, 用的是 4.1.55 版本。这个版本和 4.1.x 其他版本源码是有较大变化,我们可以直接排除 lettuce-core 的所有 Netty依赖,让其使用我们引入的 netty-all 4.1.6 Final 版本。
<!--redis连接-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<artifactId>netty-common</artifactId>
<groupId>io.netty</groupId>
</exclusion>
<exclusion>
<artifactId>netty-handler</artifactId>
<groupId>io.netty</groupId>
</exclusion>
<exclusion>
<artifactId>netty-transport</artifactId>
<groupId>io.netty</groupId>
</exclusion>
</exclusions>
</dependency>
重启项目查看是否问题解决:

无告警,已解决!
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论
您可能感兴趣的博客
