Tomcat线程复用与Threadlocal引发的惨案

问题复现
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项目中可能引发一些不必要的异常。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小沈同学呀

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值