ThreadLocal 使用后未及时释放
写一个类继承 ServletRequestListener ,配置@WebListener注解:【已测试】
@WebListener
public class RequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
/**
* 清空ThreadLocal,避免线程池中线程复用导致ThreadLocal被串用.
* 因此,request请求完毕就要销毁ThreadLocal。
*/
OperatorHolder.clearOperator();
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
}
}
在springboot启动类增加如下@ServletComponentScan注解,以此来启用监听组件
//参数指定listener路径
@ServletComponentScan("com.your.package.to.listener")
//...其他注解忽略
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
另附:拦截器的afterCompletion
方法里面释放应该也可以【未测试】
@Slf4j
@Component
public class SupplierAuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
...忽略部分....
...忽略部分....
}
...忽略部分....
@Override
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//完成后释放
CurrentSupplierUser.clear();
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
...忽略部分....
}
参考文章 ThreadLocal在线程池中被串用_threadlocal串数据-CSDN博客
参考文章是过滤器Filter,我这里的情况差不多,拦截器,也是没有释放ThreadLocal 导致请求频繁的时候串数据了。
http://blog.xqlee.com/article/2407021124184704.html