Сервлеты, фильтры и темы в Tomcat - PullRequest
1 голос
/ 02 августа 2010

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

Ответы [ 3 ]

5 голосов
/ 02 августа 2010

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

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

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

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

  • Отправил вызов через AsyncContext
  • смешался в EJB и начал использовать @Asynchronous или TimerService

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

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

4 голосов
/ 02 августа 2010

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

0 голосов
/ 02 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...