Каков жизненный цикл HttpServlet? - PullRequest
24 голосов
/ 09 октября 2010

В принципе, как долго работает экземпляр сервлета? Я отчасти догадываюсь, что это сессия. Тем не менее, я полагаю, что для удаления старых экземпляров может потребоваться какое-то время ожидания или сборка мусора.

Ответы [ 11 ]

38 голосов
/ 09 октября 2010
  • сервлет создается при запуске приложения (оно развернуто в контейнере сервлета) или при первом обращении к нему (в зависимости от настройки load-on-startup)
  • когда создается сервлет, метод init() сервлета называется
  • затем сервлет (его единственный экземпляр) обрабатывает все запросы (его метод service() вызывается несколькими потоками). Вот почему не рекомендуется иметь какую-либо синхронизацию, и вам следует избегать переменных экземпляра сервлета
  • когда приложение не развернуто (контейнер сервлета останавливается), вызывается метод destroy().
13 голосов
/ 09 октября 2010

Жизненный цикл четко определен и доступен через методы жизненного цикла, представленные в методах сервлета init, service и destroy.

И, несмотря на то, что еще здесь сказано, это все, на что вы можете рассчитывать из спецификации. По сути, вы получаете эти три метода и гарантию, что сервлеты не являются поточно-ориентированными. Чтобы к одному сервлету МОЖНО одновременно обращаться по одному или нескольким запросам.

В спецификации нет ничего, что ограничивало бы сервлет одним экземпляром контейнера, если контейнер решит, он может получить запрос, создать сервлет, вызвать его init, затем service, затем уничтожить методы и освободить его. для сбора мусора.

Отдельные контейнеры имеют потенциально разные реализации.

Большинство контейнеров создают один экземпляр. Но спецификация не гарантирует этого, поэтому на нее не следует полагаться.

Также рассмотрим что-то вроде Google App Engine. GAE ОЧЕНЬ агрессивен, постоянно истекает и закрывает целые веб-приложения, которые не получают трафик. Если у вас небольшой сайт, вы можете ожидать, что все приложение запустится, запустит все его службы, запустит любые сервлеты загрузки при запуске, выполнит запрос, а затем закроет все. Таким образом, в GAE крайне важно, чтобы у вас был очень быстрый запуск приложений, чтобы сохранить какое-либо подобие производительности.

Итак, просто, на что вы можете рассчитывать, так это в спецификации. Отдельные контейнеры могут предлагать различное время выполнения.

5 голосов
/ 09 октября 2010

Сервлет живет столько, сколько работает приложение.

4 голосов
/ 09 октября 2010

Сервлет не привязан к сеансу, это сервисный объект, который создается контейнером при необходимости и обычно поддерживается в течение всего срока службы веб-приложения.Обычно он отвечает на запросы от нескольких клиентов (и сеансов), даже одновременные запросы.Именно поэтому ваш код сервлета должен быть потокобезопасным, и вы никогда не сохраняете в поле сервлета некоторые данные, связанные с запросом или сеансом.

2 голосов
/ 26 июня 2014

Жизненный цикл сервлета может быть определен как весь процесс от его создания до уничтожения. Ниже приведены пути, по которым следует сервлет

  • Сервлет инициализируется путем вызова метода init ().
  • Сервлет вызывает метод service () для обработки запроса клиента.
  • Сервлет завершается вызовом метода destroy ().
  • Наконец, сервлет - это мусор, собираемый сборщиком мусора JVM.

Подробнее здесь ..

http://www.dzone.com/links/r/java_ee_servlets_life_cycle.html

1 голос
/ 29 октября 2016

На самом деле сервлет может быть уничтожен и воссоздан в любое время!Таким образом, другие ответы как бы описывают весь жизненный цикл, но пропускают эту важную деталь.Из спецификации сервлета:

Контейнер сервлета не обязан сохранять сервлет загруженным в течение какого-либо определенного периода времени.Экземпляр сервлета может оставаться активным в контейнере сервлета в течение миллисекунд, в течение срока службы контейнера сервлета (который может составлять несколько дней, месяцев или лет) или любое другое время между ними.

[...]

После вызова метода уничтожения для экземпляра сервлета контейнер не может направлять другие запросы этому экземпляру сервлета.Если контейнеру необходимо снова включить сервлет, он должен сделать это с новым экземпляром класса сервлета.

1 голос
/ 22 февраля 2012

Сервлет (его единственный экземпляр) будет обрабатывать n номеров запросов в виде отдельного отдельного потока для каждого клиента, то есть там, где преодолено ограничение CGI.

Объект сервлета живет в куче серверной машины, пока приложение не развернуто или servletConatiner завершает работу, объект сервлета не умрет.

Технически: servletcontainer содержит объект servletobject, а servletobject содержит объект servletConfig

Servletcontainer может вызывать только 3 метода своего жизненного цикла 1) init () 2) service () 3) destroy ()

1 голос
/ 09 октября 2010

, если я правильно помню, сервлеты живут как синглетоны в контейнере сервлетов (например, Tomcat). Я не уверен, является ли первый экземпляр ленивым, что означает, что сервлет создается только при необходимости, но я предполагаю, что это можно проверить в соответствующих источниках загрузчика контейнеров сервлета. Жизненный цикл сервлета заканчивается, и его метод destroy() вызывается при завершении работы контейнера сервлета. Вы можете легко проверить это, установив точки останова или войдя в соответствующие методы init() и destroy() и конструктор, а затем просто проверьте, когда код выполняется в вашем отладчике / файле журнала.

надеюсь, что помогло.

Ссылка: Tomcat's Classloader howto

0 голосов
/ 29 августа 2018

Контейнер сервлета подключен к веб-серверу, который прослушивает запросы HTTP или HTTPS для определенного номера порта (порт 8080 обычно используется во время разработки, а порт 80 - в работе).Когда клиент (пользователь с веб-браузером) отправляет HTTP-запрос, контейнер сервлета создает новые объекты HttpServletRequest и HttpServletResponse (для каждого нового запроса) и передает их через любую определенную цепочку фильтров и, в конечном итоге, экземпляр сервлета.

В случае фильтров вызывается метод doFilter().Когда его код вызывает chain.doFilter(request, response), запрос и ответ переходят к следующему фильтру или попадают в сервлет, если не осталось фильтров.

В случае сервлетов вызывается метод service() (несколькими потоками для разных запросов).По умолчанию этот метод определяет, какой из doXxx() методов вызывать на основе request.getMethod().Если определенный метод отсутствует в сервлете, то в ответе возвращается ошибка HTTP 405.

Объект запроса обеспечивает доступ ко всей информации о запросе HTTP, такой как его заголовки и тело.Объект ответа предоставляет возможность контролировать и отправлять ответ HTTP, например, так, как вы хотите, например, позволяя вам устанавливать заголовки и тело (обычно с сгенерированным содержимым HTML из файла JSP).Когда HTTP-ответ фиксируется и завершается, объекты запроса и ответа перерабатываются и создаются для повторного использования.

0 голосов
/ 15 января 2016
life cycle of servlet >
1) load the class.
2) instantiate the servlet.
3) servlet container construct the servlet config interface.
4) container call the init() and pass the servlet config object.
5) httpRequest and httpResponse object created.
6) container call the service() and pass the httpRequest and httpResponse object as argument.
7) process the service method.and if have any other request then follow the step 4 again.
8) other wise container call the distroy().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...