2010-08-02 3 views
1

В контейнере Tomcat все фильтры, связанные с сервлетом, и сам сервлет используют тот же поток? i.e, будет ли makeFilter() запускаться в том же потоке, что и метод service() сервлета? Заранее спасибо.Сервлеты, фильтры и потоки в Tomcat

ответ

-1

Да, каждый запрос выполняется в пределах одного экземпляра сервлета. Контейнер контейнера получает каждый запрос и запускает новый поток, содержащий HttpServletRequest и HttpServletResponse. Этот поток обрабатывает запрос в методе службы экземпляра сервлета и будет уничтожен, как только метод обслуживания завершится.

+0

Контейнер сервлета управляет жизненным циклом сервлета, а не разработчиком. – duffymo

+1

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

+0

Обратите внимание, что 'SingleThreadModel' ** устарел ** с сервлета 2.4 более 5 лет назад. Вы не должны использовать его. Это будет означать * плохой дизайн *. – BalusC

4

Да, каждый запрос выполняется в одном потоке, включая все фильтры и целевой сервлет.

3

Я подозреваю, что вопрос больше: могу ли я использовать объекты ThreadLocal для передачи данных между фильтрами и сервлетами? В этом случае ответ абсолютно. Серверы приложений делают это сами, чтобы отслеживать безопасность, транзакцию, соединение и другую информацию запроса.

Просто убедитесь, что вы очищаете свой ThreadLocal в блоке finally в том же коде, который устанавливает ThreadLocal.

Как уже отмечалось другим, сами сервлеты могут быть синхронизированы или не синхронизированы, но это ортогонально понятию состояния резьбы; т. е. сколько потоков выполняется против объекта foo vs. я могу поместить состояние в поток и увидеть его с помощью объекта foo. Ответ на второй вопрос всегда да.

Единственный раз, когда ответ не будет «нет», если вы использовали любой асинхронной связи:

  • Передается вызов через AsyncContext
  • смешанных в EJBs и начали использовать @Asynchronous или TimerService

Сюда входит сервер приложений, запускающий новые потоки, не связанные с исходным потоком запросов, поэтому любое состояние ThreadLocal не будет перемещаться с новым потоком. Именно поэтому эти API не позволяют передавать контекст безопасности и транзакции вызывающего объекта в метод, вызываемый в качестве вызывающего и метода, в разных потоках.

Условное примечание: InheritableThreadLocal обычно не работает, поскольку вызовы асинхронного вызова обычно выполняются сервером с пулом потоков, а не создаются дочерние потоки потока вызывающего.

Смежные вопросы