Вскоре мне пришлось столкнуться с подтекающим потоком с именем " Mojarra-WebResourceMonitor-1-thread-1 " на Apacht Tomcat 8.0.26 с Mojarra 2.2.12 в моем веб-приложении с использованием сервлета sepc 3.0.
Основная причина состояла в том, что два экземпляра com.sun.faces.config. ConfigureListener были добавлены в ServletContext.
Первый экземпляр(A) был добавлен контейнером Tomcat SCI org.apache.jasper.servlet.JasperInitializer.onStartup(...)
, как это настроено в javax.faces-2.2.12.jar! /META-INF/jsf_core.tld
Второй экземпляр (B) был добавлен
com.sun.faces.config.FacesInitializer.onStartup(...)
Обходной путь состоял в том, чтобы предотвратить вызов JapserInitializer путем редактирования моего контекста веб-приложения context.xml и добавления атрибута containerSciFilter в элемент контекста:
<Context containerSciFilter="org.apache.jasper.servlet.JasperInitializer|org.apache.tomcat.websocket.server.WsSci">
Оба SCI не нужны для моего веб-приложения.Так что этот обходной путь не поможет, если вы зависите от JSP и JSF.
Вот что произошло здесь неправильно:
При инициализации сервлета, tomcat называется
A.contextInitialized(...)
- Инициализация JSF
- Запуск потока
B.contextInitialized(...)
- Поскольку JSF работает ... нечего делать
При выключении, звонки:
B.contextDestroyed(...)
- Выключение JSF
- Не знаю ни о каком threadPool, так как я его еще не запустил.
A.contextDestroyed(...)
- Поскольку JSF остановлен, ничего не делать.
Таким образом, поскольку 'threadPool остается в рабочем состоянии и предотвращает сбор GC на WebAppClassloader.
Но чья это ошибка?
- Не удалось ли Tomcatотклонить несколько слушателей одного и того же класса?
- Не удалось ли JSF Mojarra остановить threadPool из-за его отсутствия threadPool, когда JSF не запущен и не запущен?
- Это неправильно, что слушатель is объявляется дважды:
- Программно через SCI
- Объявлено в основной метке TLD.
Редактировать: Былодля меня проблематично полностью пропустить JasperInitializer.Мне пришлось удалить его из containerSciFilter и добавить javax.faces - *. Jar в фильтр Tomcat tldSkip, например:
<JarScanner>
<JarScanFilter defaultPluggabilityScan="false"
pluggabilityScan="${tomcat.util.scan.StandardJarScanFilter.jarsToScan}, javax.faces-*.jar"
tldSkip="${tomcat.util.scan.StandardJarScanFilter.jarsToSkip}, , javax.faces-*.jar" />
</JarScanner>