我们有一个普通的服务器堆栈,包括BlazeDS,Tomcat和Hibernate。
我们想安排一些事情,如果抛出某些错误(特别是AssertionError),当前线程被认为处于未知状态,不会用于进一步的HTTP请求。 (部分原因是我们在线程本地存储中存储了一些东西,比如Hibernate事务会话。现在,我们可以捕获throwable并确保回滚事务并重新抛出,但是不能保证其他代码可能留下了什么知道线程本地存储中的内容。)
具有默认线程池行为的Tomcat重用线程。我们尝试指定自己的执行程序,这似乎是更改其线程池行为的最具体方法,但它并不总是为每个请求调用带有新任务的Executor.execute()。 (很可能它为同一HTTP连接中的所有请求重用相同的执行上下文。)
一个选项是禁用keepalive,这样每个HTTP连接只有一个请求,但这很难看。
无论如何,我想知道。有没有办法告诉Tomcat不要重用一个线程,或者杀死或退出线程以便Tomcat被迫创建一个新线程?
(从Tomcat源代码看,Tomcat会在发送HTTP 500响应后关闭连接并放弃任务/线程,但我不知道如何让BlazeDS生成500响应;这是另一个角度我'我想了解更多。)
答案 0 :(得分:4)
我强烈建议您放弃使用线程本地存储,或至少提出一种方法,在请求首次进入管道时清除线程本地存储(<filter>
为例如,web.xml)。
必须重新配置一些关于Tomcat的基本知识才能让它与你的应用程序一起工作,这就是代码味道。