Как заставить Apache Tomcat не использовать поток из пула потоков? - PullRequest
2 голосов
/ 12 апреля 2011

У нас есть обычный серверный стек, включающий BlazeDS, Tomcat и Hibernate.

Мы бы хотели устроить так, чтобы при возникновении определенных ошибок (особенно AssertionError) текущий поток находился в неизвестном состоянии и не использовался для дальнейших HTTP-запросов. (Отчасти потому, что мы храним некоторые вещи, такие как сеанс транзакций Hibernate, в локальном хранилище потоков. Теперь мы можем перехватывать throwables и проверять откат транзакций и повторное генерирование, но нет никакой гарантии, что может оставить кто-то другой знает, что в потоке-локальное хранилище.)

Tomcat с поведением пула потоков по умолчанию повторно использует потоки. Мы попытались указать нашего собственного исполнителя, который, похоже, является наиболее специфичным методом изменения поведения пула потоков, но он не всегда вызывает Executor.execute () с новой задачей для каждого запроса. (Скорее всего, он использует один и тот же контекст выполнения для всех запросов в одном и том же HTTP-соединении.)

Один из вариантов - отключить keepalive, чтобы на каждое соединение HTTP был только один запрос, но это ужасно.

Во всяком случае, я хотел бы знать. Есть ли способ сказать Tomcat, что он не должен повторно использовать поток, или убить или выйти из потока, чтобы Tomcat был вынужден создать новый?

(Похоже, из источника Tomcat Tomcat закроет соединение и откажется от задачи / потока после отправки ответа HTTP 500, но я не знаю, как заставить BlazeDS сгенерировать ответ 500; Хотелось бы узнать больше о.)

1 Ответ

4 голосов
/ 12 апреля 2011

Я бы настоятельно рекомендовал просто избавиться от использования локального хранилища потоков или, по крайней мере, придумать способ очистки локального хранилища потоков при первом поступлении запроса в конвейер (с <filter> в web.xml, например).

Необходимость перенастроить что-то простое в Tomcat, чтобы заставить его работать с вашим приложением, указывает на запах кода.

...