Порядок вызова метода destroy() на сервлетах / фильтрах

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

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

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

но, как я могу указать порядок вызова destroy() методами?

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

1 ответов


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

2.3.4 конца службы

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

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

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

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

использовать ServletContextListener. Он гарантированно будет инициализирован и уничтожен только один раз.