Вызов метода уничтожения сервлета - программирование
Подтвердить что ты не робот

Вызов метода уничтожения сервлета

Согласно ссылке http://www.xyzws.com/Servletfaq/when-is-destroy-of-servlets-called/20, одна из причин вызова метода destroy - , когда сервлет не получил запрос в течение длительного времени.

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

Собственно, меня попросили задать этот вопрос в интервью, и он сказал мне, что метод destroy будет вызван только при выключении сервера.

Оцените любую помощь по этому вопросу.

4b9b3361

Ответ 1

AFAIK,

В Java-сервлете destroy() не должен вызываться программистом. Но, если он вызывается, он выполняется. Неявный вопрос: будет ли сервлет уничтожен? Нет, не будет. destroy() метод не должен и не будет уничтожать Java-сервлет.

Значение destroy() в Java-сервлет заключается в том, что контент запускается непосредственно перед тем, когда контейнер решает уничтожить сервлет. Но если вы вызываете метод destroy() самостоятельно, содержимое просто выполняется, а затем продолжается соответствующий процесс. В соответствии с этим вопросом выполняется destroy(), а затем завершается инициализация сервлета.

Сначала запускается метод

destroy(), затем сервлет удаляется из контейнера, а затем собирается мусор. destroy() метод обычно содержит код для освобождения любых ресурсов, таких как соединение JDBC, которые не будут собирать мусор.

Ответ 2

Из спецификации (The Servlet Interface -> Servlet Life Cycle -> End of Service):

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

Спецификация относится к конкретному экземпляру разрушаемого сервлета.

Итак, означает ли это, что будет вызван уничтожён, и они больше не будут использоваться?

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

Ответ 3

Пара случаев:

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

В соответствии с документом

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

Ответ 4

Это одна из тех классических опций, связанных с реализацией. Контейнеры сервлета, такие как Tomcat, допускаются спецификацией для поддержки пула объектов Servlet, создавая и уничтожая их, когда загрузка идет вверх или вниз. В такой конфигурации, уничтожение будет вызываться, когда конкретный экземпляр больше не нужен. Было бы даже законно создавать новый экземпляр для каждого запроса, вызывая init непосредственно перед обработкой запроса и уничтожая сразу после.

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

Я не могу придумать много случаев, когда вы захотите объединить Servlets, но это разрешено спецификацией.

Ответ 5

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

В стр. 22 спецификации сервлета 2.5 вы обнаружите, что "когда контейнер сервлета определяет, что сервлет должен быть удален из службы, он вызывает метод destroy интерфейса Servlet, чтобы позволить сервлету выпускать любые ресурсы, которые он используя и сохраняя любое постоянное состояние. Например, контейнер может сделать это, когда он хочет сохранить ресурсы памяти или когда он отключается."

Ответ 6

Servlet.destroy() javadoc говорит: "Вызывается контейнером сервлета, чтобы указать сервлету, что сервлет выводится из службы". В нем не указывается, какие ситуации могут привести к тому, что сервлет будет "выведен из системы", это просто событие, на которое вы можете реагировать, если вам нужно. Например, вы можете закрыть некоторые ресурсы, которые вы открыли, или сохранить некоторое состояние для хранения.

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

Ответ 7

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