问题背景为:
用户登录后台系统后,会根据用户的token查询客户信息,并且将客户信息绑定到线程变量中,方便后续使用。
出现问题:如果访问某些请求时客户未登录,会返回402状态,通过日志监控由于运维加了心跳检测,出现大量未登录的报错,这个本身是正常的,但是诡异的问题是,下面日志中会出现客户的客户编号,正常来讲,用户未登录就不存在token,然后就不可能缓存客户信息,所以这篇博客围绕这个问题进行阐述。
通过猜想可以根据日子打印的线程号来看下相同线程号之前的业务处理逻辑。
通过排查,这个线程号确实之前有做过业务操作
得出结论:系统接收接口请求,是将请求放到线程池中执行的,第一张图之所以有客户号,是因为他复用了上一个请求的线程,之前线程绑定的内部变量没有清除,所以后面重用那个线程时候会出现混乱的情况,
解决方式:当一个请求处理结束后,移除线程的变量。问题解决
线程变量绑定方式:InheritableThreadLocal,优势可以向子线程进行传递