Порядок вызова метода destroy () для сервлетов / фильтров - PullRequest
6 голосов
/ 29 июля 2011

У меня есть веб-приложение на Java.

Я могу указать порядок вызова метода init() для сервлетов с помощью параметра в web.xml:

<load-on-startup>1</load-on-startup>

Но как это сделать?Я указываю порядок вызова destroy() методов?

На самом деле, мне нужно просто отключить log4j в конце.Но заранее я хочу знать, есть ли какие-то правила для вызова метода destroy().

1 Ответ

8 голосов
/ 29 июля 2011

Я посмотрел спецификацию Servlet 3.0. Он не определяет никаких правил для порядка, в котором должны вызываться методы destroy. Таким образом, он не указан, и вы не должны полагаться на поведение конкретного поставщика. Вторая причина отказа в освобождении ресурсов, общих для Сервлетов , заключается в том, что данный Сервлет может быть уничтожен в любое время - если контейнер решит это сделать. См. Раздел 2.3.4 спецификации Servlet 3.0:

2.3.4 Окончание срока службы

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

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

Допустим, у вас есть 3 сервлета - A, B и C. Если A и B полагаются на ресурсы, управляемые C, может случиться так, что контейнер решит временно отключить C, вызвав его метод destroy. Так что A и B больше не будут иметь доступа к этим ресурсам. Должен признать, я никогда не видел такого поведения в реальности.

Рекомендация:

Использовать ServletContextListener . Гарантируется, что он будет инициализирован и уничтожен только один раз.

...