DevOps日常采坑日记(一)
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要慎用,用之前一定要考虑清楚,数据能不能正确切割,不能正确切割就可能存在数组越界的问题。
谨记!
谨记!
至于为什么线程出现了异常会断开长连接的问题,请看我的另一篇博客。