kaka的gravatar头像
kaka 2016-09-06 13:49:07
记一次线上java守护线程导致历史数据中断的问题

简单描述下场景:我们是做设备的监控,针对每台设备的监控默认的任务是3分钟执行一次,我们的数据中心和采集节点是分布式的,两个进程是通过zeromq的push-pull方式进行通信的,数据中心将任务push到采集节点,采集节点pull到任务后,开始执行任务,然后将采集到得数据规整后放入一个Map集合中,采集节点端会单独启动一个线程去检测这个Map集合的数据量,到达一定量级或者等待一定的时间后,会将这个集合中的数据push给数据中心进行处理保存等业务。

问题描述:最近项目在进行稳定性测试,我发现项目运行一段时间后,历史数据就会中断,查看数据中心和采集节点的日志,没有发现有异常的日志,不过我将日志级别修改为info的后,发现数据中心一直在打印下发任务,如下图

记一次线上java守护线程导致历史数据中断的问题

而节点也在打印节点接收到任务,如下图:

记一次线上java守护线程导致历史数据中断的问题

从上面日志可以看出,采集节点和数据中心的通信没有问题,我开始怀疑是节点没有给之前提到的Map集合中放数据,但是验证后发现这种猜想是错误的。在毫无头绪之时,我重新看了一遍采集节点启动时的方法,如下:

记一次线上java守护线程导致历史数据中断的问题

发现这个检测线程被设置成守护线程了,查看了下守护线程的作用后才知道,守护线程在主线程结束的时候,会自动退出。我们自己的业务是主线程是线程池在接收数据中心下发的任务并多线程去处理,守护线程在做数据检测并发送数据给数据中心,这样看,数据中心是每隔3分钟下发一批任务,这个时候采集节点接收任务,接收完成后,主线程退出,守护线程也就退出了,所以就导致数据一直不回写了。

顺便写了个demo验证了下,守护线程执行5次后退出:

记一次线上java守护线程导致历史数据中断的问题

记一次线上java守护线程导致历史数据中断的问题

将这个t.setDaemon( true );去掉后,即使主线程结束,检测线程也不会退出。


打赏
最近浏览
wkc  LV21 2020年6月28日
yinyun1985  LV14 2020年4月23日
时至秋雨  LV6 2017年12月12日
springlala  LV2 2016年12月8日
NopeHzau1  LV1 2016年12月7日
dzg123456  LV1 2016年11月18日
364502984  LV18 2016年11月8日
heyongbin130  LV1 2016年10月21日
horsezexin  LV1 2016年10月2日
可可_西里  LV11 2016年9月29日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友