Почему бы не сделать оба?Хотя ServletContextListener больше подходит для веб-приложения, я обнаружил, что во время разработки сервер часто останавливается внезапно, а затем никогда не вызывается contextDestroyed (), поэтому вы можете использовать оба механизма, чтобы гарантировать, что всегда будет корректное завершение работы:
Реализация ServletContextListener, где contextInitialized вызывает addShutdownHook () и contextDestroyed вызывает removeShutdownHook ().Хук и contextDestroyed могут оба делегировать некоторому внутреннему методу, чтобы фактически выполнить очистку.
Таким образом, если слушатель вызывается должным образом, хук добавляется и удаляется (но не вызывается), и утечка отсутствует.но если сервер умирает без уничтожения контекста, ловушка отключения очищает все.