我们有一个在JBoss中运行的Spring MVC Web应用程序,其中一些用户信息存储在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>
答案 0 :(得分:1)
“[...]读取另一个请求存储在ThreadLocal中的数据。”
我认为问题的标题应该是“May Spring MVC为连续请求提供线程”,答案是“是的,它一直在做”。
也许您认为在每种情况下都清理了threadlocal存储,但是在servlet环境中可能存在各种异常情况,有些完全不受您的控制。例如,客户端可以随时关闭TCP连接。