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

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路Tomcat线程复用与Threadlocal引发的惨案,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154704.html

(1)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!