我们有一个 Spring MVC Web 应用程序,在 JBoss 中运行,其中一些用户信息存储在 ThreadLocal 对象中。我们遇到一个问题,似乎有时某些请求会在任何请求完成执行之前覆盖另一个请求存储在 ThreadLocal 中的数据。这可能吗?
换句话说,JBoss 请求是否有可能在某些时候屈服于另一个请求,例如当运行拦截器或访问某些类型的 bean 时?
我尝试将 JBoss 中的工作线程数量减少到 1,并且能够以这种方式相当可靠地重现我们的问题。这是我使用的配置:
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<virtual-server name="default-host" enable-welcome-root="true">
<alias name="localhost"/>
<alias name="example.com"/>
</virtual-server>
</subsystem>
最佳答案
“[...]读取另一个请求已存储在ThreadLocal中的数据。”
我认为问题的标题应该是“May Spring MVC resue thread for Continuous requests”,答案是“是的,它一直都是这样”。
也许您认为在每种情况下都会清理线程本地存储,但 servlet 环境中可能存在各种异常情况,有些情况完全超出您的控制范围。例如客户端可以随时关闭TCP连接。
关于java - Spring MVC 可以在请求期间切换线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16772760/