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