记一次现场问题的协助排查

现场问题:部分文件数据被删掉,内部代码报错,提示找不到该文件
    简介:定时任务扫表,查出状态为0的数据,数据通过视图方式去第三方拉取,保存在临时文件夹,然后根据订单关系对应重新保存对应文件夹,入库记录。
    特点:
        1.属于多线程处理IO密集型任务,某一线程单次执行完任务需要30分钟。
        2.线程池选用的默认队列(无界队列LinkedBlockingQueue)
        3.最大线程数设置8个
        4.定时任务时间设置为每20分钟一次
        5.任务执行完毕,更改表状态为1
        6.单个线程文件夹大小为500KB*300个\approx150M
     问题追踪
        1.查看日志定位报错位置,发现在copy文件时报错,
        2.根据代码追踪发现,每次的临时文件夹名称是固定的(file/order:检查单号)
        3.推想是不是其它线程把那个文件删掉了,因为每次执行完业务流程都会删掉临时文件夹。
        4.最后发现单条线程执行大概需要30分钟,但是task任务10分钟执行一次,
所以会不会出现重复拉取同一条检查单数据,最后看日志发现,线程4和线程5确实拉的同一条数据,
而且线程提前走了删除逻辑,真相大白。
      解决措施
        1.如果查到某条数据,更新状态为2(执行中),避免重复拉取,重复拉取占用大量资源。等本次处理完,如果处理成功则改状态为1,如果失败则改0
        2.更新表数据方法加锁,防止锁表。
      思考优化点,面对IO密集型多线程处理,代码应该怎么优化:
        1.针对此场景选择线程池队列建议设置大小
        2.代码业务逻辑需要优化。
        3.定时任务时间需要研究。
        4.设置线程池异常处理机制。
    遗留的问题
        1.一个系统各种定时任务很多,应该怎么去优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬天豆腐

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值