欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DevOps日常采坑日记(一)

程序员文章站 2022-03-02 13:48:18
...

DevOps日常采坑日记(一)

写在前面:作为一个初来匝道的java小菜鸟来说,我觉得写写bug日记,写写博客日志啥的是非常有必要的。首先这个有两个好处,第一个当然是记录自己踩过的坑,以防以后再次入坑,其次就是不知道找谁吐槽,只好和广大网友吐槽吐槽,也可以警醒一下各位广大网友,不要再踩我的坑了。

今天我就来分享一下我在项目中遇到的一个问题,这个问题不是难的问题,甚至可以说是很简单。但是就是这种简单又小的问题,往往是最让人头疼的事情,这种问题往往都是最难发现的问题。当你花了很久的时间,发现原来是这么小的问题困扰你这么久的时候,你可能会像我一样,来一句粗话,拍一下桌子,然后露出有高兴又生气的表情。今天我就是遇到了一件这样的事情,别人说bug出在我这,但是我坚信我自己的代码不可能出错,但是经过几番论证之后,我发现还真tm的是我这里的问题。哈哈,像我这样打脸的人应该不会在少数吧,甩锅侠,打脸怪。

问题是这样的,我们公司主要是做通信的,我主要负责java后端和硬件板进行通信,我使用的通信框架是netty,大家都知道,netty一般用在并发量比较大的场景,所以底层实现肯定是nio的。不说那么复杂,netty你就把它看成是一个线程池,有很多线程等待连接。我同事在那测试硬件板上报数据,但是连上服务端,也就是和我netty的端口连上了之后,上报了一次数据,就发现socket closed。它那里看不到什么日志,然后就问我能不能看到日志,我就和他说,其他设备都正常通信,咋就你的不行,你在好好看看是不是你哪里弄错了/捂脸。经过三番两次确认之后,最后还是来找我了,最后还真是发现是我这边的问题。我打了好几个log,最终定位在一个地方。报错信息是这样的。

socket.ByteDataHandler Line:68  - java.lang.ArrayIndexOutOfBoundsException: 1

分析了老半天,一开始分析是不是链接断开了,我channel设置的属性和值取不出来或者没存进去导致数据越界了?然后再那里做了一些优化,做了一下非null判断。结果一测试还出问题,然后我使用ExceptionUtils.getStackTrace(cause)将详细的报错信息打印出来了,发现,问题不出在channel上,出在该方法的调用的解析数据的方法上。最后细致的地位,发现我靠,居然出在一个split方法上,晕,吐半管血。

String[] cellArr = strArr[strArr.length - 1].split(",");
String cell = cellArr[0].substring(1, cellArr[0].length()) + "," + cellArr[1];  

这里为什么会错呢?我在看了一下数据上报上来的数据是这样的
cellcount=0,,我看到之后就想吐血,按理来说这种数据我应该抛弃,都不应该丢过来解析。正常的数据是这样的cellcount=1,21145,20733,16,。你说气不气。之后我就加了个判断,不过这样也好,以后用split我就会多一个心眼了。

这里提醒大家一下,split要慎用,用之前一定要考虑清楚,数据能不能正确切割,不能正确切割就可能存在数组越界的问题。
谨记!
谨记!

至于为什么线程出现了异常会断开长连接的问题,请看我的另一篇博客。

相关标签: 解决方案 netty