В контейнере Tomcat все фильтры, связанные с сервлетом, и сам сервлет используют тот же поток? i.e, будет ли makeFilter() запускаться в том же потоке, что и метод service() сервлета? Заранее спасибо.Сервлеты, фильтры и потоки в Tomcat
ответ
Да, каждый запрос выполняется в пределах одного экземпляра сервлета. Контейнер контейнера получает каждый запрос и запускает новый поток, содержащий HttpServletRequest и HttpServletResponse. Этот поток обрабатывает запрос в методе службы экземпляра сервлета и будет уничтожен, как только метод обслуживания завершится.
Да, каждый запрос выполняется в одном потоке, включая все фильтры и целевой сервлет.
Я подозреваю, что вопрос больше: могу ли я использовать объекты ThreadLocal для передачи данных между фильтрами и сервлетами? В этом случае ответ абсолютно. Серверы приложений делают это сами, чтобы отслеживать безопасность, транзакцию, соединение и другую информацию запроса.
Просто убедитесь, что вы очищаете свой ThreadLocal в блоке finally в том же коде, который устанавливает ThreadLocal.
Как уже отмечалось другим, сами сервлеты могут быть синхронизированы или не синхронизированы, но это ортогонально понятию состояния резьбы; т. е. сколько потоков выполняется против объекта foo vs. я могу поместить состояние в поток и увидеть его с помощью объекта foo. Ответ на второй вопрос всегда да.
Единственный раз, когда ответ не будет «нет», если вы использовали любой асинхронной связи:
- Передается вызов через AsyncContext
- смешанных в EJBs и начали использовать @Asynchronous или TimerService
Сюда входит сервер приложений, запускающий новые потоки, не связанные с исходным потоком запросов, поэтому любое состояние ThreadLocal не будет перемещаться с новым потоком. Именно поэтому эти API не позволяют передавать контекст безопасности и транзакции вызывающего объекта в метод, вызываемый в качестве вызывающего и метода, в разных потоках.
Условное примечание: InheritableThreadLocal обычно не работает, поскольку вызовы асинхронного вызова обычно выполняются сервером с пулом потоков, а не создаются дочерние потоки потока вызывающего.
- 1. Java8 потоки и фильтры
- 2. Сервлеты и сервер Apache Tomcat
- 3. Скомпилирует ли tomcat сервлеты?
- 4. JavaBean Самоанализ в сервлеты [Tomcat]
- 5. Фильтры в tomcat
- 6. UTF-8 и сервлеты на Tomcat/Linux
- 7. Postlogin hook функция, использующая сервлеты, фильтры
- 8. Список web.xml Сервлеты и фильтры, соответствующие конкретному запросу
- 9. исходные потоки под Tomcat
- 10. Ошибка в Jsp и сервлеты
- 11. Как сделать сервлеты для openhift tomcat?
- 12. Сервлеты на Tomcat: Запрошен ресурс не найден
- 13. Tomcat не может заставить сервлеты работать
- 14. Сервлеты и файлы для скачивания
- 15. Добавить сервлеты программно с tomcat 6
- 16. Фильтры похожи на сервлеты. Существует множество контейнеров сервлетов. Фильтры принимают роль только в контейнере сервлета?
- 17. Как Tomcat создает потоки внутри?
- 18. Фильтры и фильтры CALayer
- 19. сервлеты и пути к классу
- 20. Где мы помещаем сервлеты в структуру каталогов Tomcat?
- 21. Сервлеты для тестирования модулей
- 22. Как заказать фильтры с Apache Tomcat 7
- 23. сервлеты и файл ресурсов
- 24. Сервлеты и связь AJAX
- 25. Сервлеты, init и extends
- 26. JSP и сервлеты
- 27. Сервлеты и рамки MVC
- 28. JSP JavaBean и сервлеты?
- 29. Сервлеты и внутренние связи
- 30. Веб-службы и сервлеты
Контейнер сервлета управляет жизненным циклом сервлета, а не разработчиком. – duffymo
Неверно, что метод службы синхронизирован - если сервлет не реализует интерфейс SingleThreadModel, Tomcat будет успешно запускать потоки параллельно, обслуживая тот же сервлет. – nos
Обратите внимание, что 'SingleThreadModel' ** устарел ** с сервлета 2.4 более 5 лет назад. Вы не должны использовать его. Это будет означать * плохой дизайн *. – BalusC