问题复现
20220719
10:20 业务端用户大量投诉,自动回收数据异常。
10:25 经核实发现生产环境数据回收日志异常,发现回收数据保存了操作人;用户页面直接可见本次执行人数据。
10:50 由于业务回收数据量巨大,导致业务端大量投诉。回收任务是定时任务触发是不应该存在操作人的,初步估计应该是代码缺陷。
原因分析
1、生产环境每晚凌晨会执行多个定时任务,定时任务通过xxjob主动触发
2、检查回收任务执行流程,返现自动回收任务并没有手动设置操作人信息到当前线程
3、继续排查发现晚上执行的任务中其中有一个任务主动设置了threadlocal 用户信息
4、测试环境debug调试先执行有更改threadlocal的定时任务,然后再执行自动回收任务。发现自动回收的任务线程有一定概率获取到其他任务放入线程的数据。
事故结论
1、本项目后端应用服务器为tomcat,请求从浏览器打到tomcat后,tomcat会从executor线程池按照一定策略拉取线程进行处理
2、由于tomcat执行线程是重复使用,如果其他业务流程对线程设置了数据,你们其他任务在分配到同线程会直接拉取到上次存入的数据
3、在业务开发中一定要注意threadlocal的使用,如果是放入用户数据需要在pro请求放入数据,也需要在after之后清理数据,以防止其他业务数据重复使用线程拿到异常数据。
解决办法
业务数据处理完后需要清理掉threadlocal数据
寄语:Threadlocal使用过程中需要注意数据的放入和及时清理,否则在web项目中可能引发一些不必要的异常。