我遇到了一种情况:我使用ThreadLocal静态变量在请求的生命周期中容纳包含来自不同类的各种度量值的bean。在一个过滤器中,我创建了这个bean,并将其设置在一个线程局部变量中,并在请求处理后从同一个过滤器中的线程局部变量中移除它。我碰到的是包含来自其他请求的值的bean!对此的唯一解释是共享的线程同时处理多个请求。所以标题中的问题。是否为servlet处理的整个请求保证线程?
3
A
回答
6
虽然一个线程一般将处理单个请求(谈到的Tomcat,肯定的),该线程可处理随着时间的推移多个请求而不是W/O完成现有请求,除非使用包括/向前相似者。
我非常strognly建议您使用属性瓦特/你的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
}
2
也可能是您的过滤器并不总是以您期望的顺序调用。线程被重用来一个接一个地处理多个请求,所以如果ThreadLocal
中的值没有被移除,那么当线程处理它的下一个请求时它仍然会在那里。
1
是的,你可以假设一个单独的线程将处理每个请求。
使用finally
块在处理链的其余部分后清除(设置为null
)过滤器中的ThreadLocal
。这将防止以前请求中的数据与当前请求混杂在一起。
相关问题
- 1. ExecuteRegisteredAsyncTasks是否释放请求处理线程以处理其他请求?
- 2. 作为GET处理POST请求的Servlet
- 3. 处理多个帖子请求的Servlet
- 4. servlet过滤器是否有可能计算出哪个servlet将处理请求
- 5. WCF请求是否处理线程敏捷?
- 6. 是否可以使用servlet处理ftp请求?
- 7. 从servlet创建的线程的生命是否有保证?
- 8. Python处理线程中的Socketserver请求
- 9. 似乎只有一个线程处理Servlet中的所有请求
- 10. 创建多个线程来处理多个请求是否很好?
- 11. 一个nginx工作进程是否同时处理两个请求或逐个处理两个请求?
- 12. .NET:澄清请求 - 处理线程
- 13. Grails - Servlet 3.0异步请求处理
- 14. 在JSP中处理Ajax请求Servlet
- 15. HttpContext.RemapHandler是否应该更改哪个处理程序处理请求?
- 16. asp.net web表单线程在请求处理中的线程
- 17. 在单个线程上处理来自多个线程的请求 - .NET Core
- 18. 错误的请求url处理程序servlet
- 19. 处理ASP.Net内部线程池处理请求
- 20. servlet请求和验证
- 21. Laravel验证整个请求
- 22. 切换线程后,jvm是否保证处理器高速缓存的更新?
- 23. Node.js请求 - 处理多个POST请求
- 24. Rails - 处理远程请求
- 25. 由Facebook应用程序请求的响应生成的POST是否保证为已签名的请求?
- 26. 创建一个pthread线程池来处理获取请求
- 27. Grpc:只有一个服务器线程处理所有请求
- 28. Java线程池可以处理50000个请求吗?
- 29. ASP.NET工作线程可以同时处理多个请求吗?
- 30. 线程中的处理程序的行为是否不同?
是的,“终于”做到了神奇。就像迈克尔和埃里克森所说的那样,在一种情况下,运行时异常并没有移除bean。谢谢。 – Murali 2011-01-26 23:39:36
拇指规则(或故事的道德):如果您修改任何全局状态并打算将其撤回。使用try/finally,实际上使用try/finally需要任何清理/关闭/处理(或隐式回滚),它几乎不会导致任何性能损失(认为它是免费的:D) – bestsss 2011-01-26 23:45:32