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

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

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

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

Ценим любую помощь в этом.


person Anand    schedule 18.11.2012    source источник
comment
Я не думаю, что вы должны убивать сервлет. Это не должно быть вашей ответственностью, поэтому вы находитесь в контейнере сервлетов, а сервлет - это управляемый ресурс.   -  person kolossus    schedule 18.11.2012


Ответы (8)


НАСКОЛЬКО МНЕ ИЗВЕСТНО,

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

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

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

person Bhavesh Shah    schedule 19.03.2013

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

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

Согласно документу

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

person Tony    schedule 19.11.2014

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

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

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

Значит ли это, что будет вызвана команда destroy и они больше не будут использоваться?

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

person Vikdor    schedule 18.11.2012

Из спецификации сервлета: -

Метод destroy() вызывается контейнером сервлета, чтобы указать сервлету, что сервлет выводится из эксплуатации. Этот метод вызывается только после завершения всех потоков в сервисном методе сервлета или после истечения времени ожидания. После того, как контейнер сервлета вызовет метод destroy(), он больше не будет вызывать метод службы для "ЭТОГО СЕРЛЕТА".

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

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

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

После вызова метода destroy для экземпляра сервлета контейнер не может направлять другие запросы к этому экземпляру сервлета.

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

person Roumil That's Enough    schedule 27.12.2018

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

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

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

person EdC    schedule 18.11.2012

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

На странице 22 спецификации сервлета 2.5 вы найдете следующее: «Когда контейнер сервлета определяет, что сервлет должен быть удален из службы, он вызывает метод уничтожения интерфейса сервлета, чтобы позволить сервлету освободить любые ресурсы, которые он использует, и сохранить любое постоянное состояние. Например, контейнер может делать это, когда он хочет сохранить ресурсы памяти или когда он закрывается».

person Sazzadur Rahaman    schedule 18.11.2012

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

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

person Stik    schedule 16.05.2014

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

person Sudip Bhandari    schedule 31.05.2017