@PreDestroy методы @ViewScoped bean-компонентов CDI, которые не были вызваны при отмене развертывания Tomcat - PullRequest
0 голосов
/ 07 ноября 2018

Я использую управляемые компоненты 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).

1 Ответ

0 голосов
/ 09 ноября 2018

Я пытался закрыть свои запущенные потоки с помощью ExecutorService.shutdownNow() и сохранял объект ExecutorService в качестве временной переменной-члена. Похоже, проблема заключалась в том, что сериализация выполняется перед вызовом метода @PreDestroy, из-за которого вызов завершения работы завершился сбоем.

Я полностью избавился от метода @PreDestroy и переключился на статическую переменную-член, которую я инициализирую один раз с ServletContextListener.contextInitialized() и останавливаю с ServletContextListener.contextDestroyed().

Извините за ложную тревогу!

...