Я использую управляемые компоненты CDI с аннотациями javax.inject.Named
и org.omnifaces.cdi.ViewScoped
. Одна конкретная функция в этом компоненте откроет отдельный поток для постоянного обновления поля участника (если пользователь решит активировать его в веб-интерфейсе).
Этот поток должен работать до тех пор, пока пользователь остается на странице (компонент PrimeFaces poll
гарантирует, что срок действия представления не истечет).
Эта тема должна быть остановлена, как только
- пользователь отключает функциональность в веб-интерфейсе (работает)
- пользователь переходит на другую страницу (работает)
- Tomcat отключает веб-приложение (не работает)
Я использую метод @PreDestroy
, чтобы остановить поток. Моя проблема в том, что метод @PreDestroy
не вызывается во время отмены развертывания Tomcat и приводит к предупреждению утечки памяти:
WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [webapp] appears to have started a thread named [pool-7-thread-1] but has failed to stop it. This is very likely to create a memory leak.
Ожидается ли такое поведение? И если да, каков рекомендуемый способ очистки ресурсов в управляемых компонентах CDI?
Я запускаю свое веб-приложение с JDK8 и Tomcat 8.5 (CDI 1.2 / WELD 2.4.5, OmniFaces 2.6.8, JSF 2.2 / Mojarra 2.2.14).