是否为servlet处理的整个请求保证了一个线程?

Mur*_*ali 3 java servlets exception-handling

我遇到了一种情况,我使用ThreadLocal静态变量来保存一个bean,该bean在请求的生命周期中包含来自不同类的各种度量值.在过滤器中,我创建bean并将其设置在线程局部变量中,并在处理完请求后将其从同一过滤器中的线程局部变量中删除.我遇到的是包含来自其他请求的值的bean!对此的唯一解释是共享线程以同时处理多个请求.所以标题中的问题.

bes*_*sss 6

虽然一个线程通常会处理单个请求(肯定会谈到tomcat),但线程可能会随着时间的推移处理多个请求,但不会完成现有请求,除非使用include/forward相似.

我非常谨慎地建议你使用你的bean的所述请求的属性(setAttribute())并将其用于分析.如果你不能提供各种方法的请求......那么你就会遇到ThreadLocal [这不是那么糟糕的解决方案].

或者,您可以发布代码如何安装/删除threadLocal bean.

请记住,您还必须管理该bean的某些内容(在请求之外不可用).

编辑:忘了问:你用try/finally调用doFilter(...)吗?

代码应该是这样的

installBean();
try{
  chain.doFilter(req, resp);
}finally{
 Bean b = deinstallBean();
 useTheMetrics(b);
//potentially, process exception, etc
}
Run Code Online (Sandbox Code Playgroud)