目录
方案1:InheritableThreadLocal类改成ThreadLocal
方案2:利用反射将新建线程的inheritableThreadLocals置空
方案3:改用可以传入线程本地变量的TransmittableThreadLocal
引入transmittable-thread-local依赖
背景
项目背景
- 项目中使用ThreadPoolTaskExecutor线程池来实现多任务并行处理,实现性能提升。
- 系统中使用自定义过滤器来获取用户SessionID并设置到InheritableThreadLocal中,以供后续线程可以获取到用户SessionID信息,并进一步获取到用户信息
- 项目运行在Jetty容器下
问题
线程池中的线程也可以获取到当前用户ID信息,但是值不对(有时候取不到,有时候取到的是错误值),而普通线程(指Jetty产生的线程)则可以正常获取用户ID信息。
现有代码逻辑
下面梳理下现有代码的逻辑,争取能够直接发现问题。了解现有代码逻辑,也是为后续调试做准备。
线程池配置类
相关代码如下:普普通通的ThreadPoolTaskExecutor定义的线程池,没啥毛病
package com