gpt4 book ai didi

java - 如何强制 Apache Tomcat 不重用线程池中的线程?

转载 作者:行者123 更新时间:2023-11-30 07:33:47 24 4
gpt4 key购买 nike

我们有一个普通的服务器堆栈,包括 BlazeDS、Tomcat 和 Hibernate。

我们希望这样安排,如果抛出某些错误(尤其是 AssertionError),当前线程将被视为处于未知状态,不会用于进一步的 HTTP 请求。 (部分原因是我们在线程本地存储中存储了一些东西,例如 Hibernate 事务 session 。现在,我们可以捕获可抛出的对象并确保回滚事务并重新抛出,但不能保证其他代码可能留下了谁知道线程本地存储中的内容。)

具有默认线程池行为的 Tomcat 会重用线程。我们尝试指定我们自己的执行器,这似乎是更改其线程池行为的最具体方法,但它并不总是为每个请求调用一个新任务的 Executor.execute()。 (很可能它对同一 HTTP 连接中的所有请求重用相同的执行上下文。)

一种选择是禁用 keepalive,这样每个 HTTP 连接只有一个请求,但这很丑陋。

无论如何,我想知道。有没有办法告诉 Tomcat 不要重用一个线程,或者杀死或退出线程,从而强制 Tomcat 创建一个新线程?

(从 Tomcat 的源码来看,Tomcat 似乎会在发送 HTTP 500 响应后关闭连接并放弃任务/线程,但我不知道如何让 BlazeDS 生成 500 响应;这是另一个角度我'我想了解更多。)

最佳答案

我强烈建议简单地摆脱对线程本地存储的使用,或者至少想出一种方法来在请求首次进入管道时清除线程本地存储(在 web.config 中使用 <filter> )。 xml,例如)。

必须重新配置有关 Tomcat 的一些基本内容以使其与您的应用一起工作表明代码有异味。

关于java - 如何强制 Apache Tomcat 不重用线程池中的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5629355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com