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 176浏览

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析),一、问题背景:最近某springboot项目想嵌入一个用户聊天功能,打算使用Rabbitmq+Netty4.x+Redis来开发高性能是4.1.6二、源码分析1


一、问题背景:

最近某springboot项目想嵌入一个用户聊天功能,打算使用 Rabbitmq + Netty4.x + Redis 来开发高性能聊天功能。花费三天时间所有功能都已实现。启动时却警告 :Unknown channel option 'xxxx' for channel '[id: 0xba18fac1]', 虽然是个告警但是必须解决,否则会影响正在准备建立连接的握手以及激活心跳机制->TCP自动发送一个活动探测数据报文

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_Netty

netty 使用的版本是 4.1.6


二、源码分析

1、serverBootstrap绑定处打断点,准备进入函数

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_redis_02


2、一路跟进

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_Netty_03


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

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_spring boot_04


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

然而 option instanceof NioChannelOption 不成立,所有走 super.setOption(option, value), 回到父类 DefaultServerSocketChannelConfig 中去查找:

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_.net_05


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

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_spring_06

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

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_.net_07


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

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_redis_08


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

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_spring_09

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_.net_10


三、问题解决:

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

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_.net_11

发现 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>

重启项目查看是否问题解决:

Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)_Netty_12

无告警,已解决!


好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695