Threadlocal与Tomcat线程池

Posted 10分分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Threadlocal与Tomcat线程池相关的知识,希望对你有一定的参考价值。

为了实现微服务之间token传递,并能够在当前线程很容易的获取,所以使用了threadlocal(关于threadlocal可以百度一大把)。


然而测试告知获取当前登陆人信息经常莫名其妙篡改,当然首先去查看日志,发现每一次请求都有获取token,并且也是正确的啊,木有问题啊。


测试又告知说消息列表容易复现,所以再次查询消息列表。因为项目初期人员紧张,消息又需要实时推送给用户,所以前端暂时使用了轮询的方式请求后端来拉取信息,这是发现后端日志在频发的打印日志,不过每次也有获取token啊,木有问题啊。为了查找问题只能再次多大日志了,在设置token地方,把当前线程名称打印出来,获取的地方打印日志。


部署-》测试,这次跟着线程查询,我靠!发现线程有重复显现,突然想起来,tomcat使用了线程池的,线程是复用的,但又想线程复用也无妨啊,可以覆盖掉threadlocal中的value啊,就可以得到当前真正的token,也不应该乱串啊,开发的同事又说是不是白名单问题,因为这个url设置了白名单,当时想白名单有什么问题,仅仅是网关的一种放行策略,不过也找网关问了下,网关那边说,白名单的url直接放行,并且不获取token,当时一听就傻了,我勒个去,原来白名单没有token,但又由于线程池复用了线程,所有虽然没有传递token但在threadlocal可以获取一个token,但这个却不是当前登陆人的对应token。


解决方案:

网关对白名单也需要绑定token,确定当前登陆人。

threadlocal需要在请求完毕后清除下当前线程value。


以上是关于Threadlocal与Tomcat线程池的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的 ThreadLocal

ThreadLocal与线程池共用时可能出现的的两个问题

Tomcat是如何修正JDK原生线程池bug的?

重点知识学习(8.4)--[线程池 , ThreadLocal]

是否值得在 Filter 中清理 ThreadLocals 以解决与线程池相关的问题?

ThreadLocal与线程池使用的问题