May Spring MVC在请求期间切换线程?

时间:2013-05-27 12:00:00

标签: java spring-mvc concurrency jboss

我们有一个在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>

1 个答案:

答案 0 :(得分:1)

“[...]读取另一个请求存储在ThreadLocal中的数据。”

我认为问题的标题应该是“May Spring MVC为连续请求提供线程”,答案是“是的,它一直在做”。

也许您认为在每种情况下都清理了threadlocal存储,但是在servlet环境中可能存在各种异常情况,有些完全不受您的控制。例如,客户端可以随时关闭TCP连接。