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

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

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

5f44669d9023f819b9cfa4031178418d.png

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

5f44669d9023f819b9cfa4031178418d.png

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

5f44669d9023f819b9cfa4031178418d.png

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

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

5f44669d9023f819b9cfa4031178418d.png

5f44669d9023f819b9cfa4031178418d.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值