Мы добавляем динамический контент (полученный из БД) на страницу JSF; Каждый раз, когда мы сталкиваемся с тегом, обработчик тегов извлекает контент на основе идентификатора и генерирует уникальный URL-адрес и добавляет контент в FaceletContext, вызывая includeFacelet
Внутри TagHandler
public class CustomTagHandler extends TagHandler {
@Override
public void apply(FaceletContext ctx, UIComponent parent) {
String spec = "include://dynamicUrl/" + getUniqueId() ;
String contentFromDB = "some content fetched from db based on id";
URL url = new URL(null, spec, new MyCustomHandler(contentFromDB));
ctx.includeFacelet(parent, url);
nextHandler.apply(ctx, parent);
}
}
MyCustomHandler расширяет URLStreamHandler, как показано на странице Включает динамический контент, содержащий теги / компоненты JSF из потока
Проблема здесь заключается в том, что все уникальные URL-адреса добавляются в кэш лицевых страниц JSF, и срок их действия никогда не истекает. Размер кучи JVM растет и не хватает памяти. Эти URL никогда не собираются сборщиком мусора, так как на них ссылается кэш лицевых страниц JSF.
Кто-нибудь знает, чтобы исключить некоторые фасеты из добавления в кеш JSF или каким-либо образом удалить эти фасеты из кеша JSF?
Я не хочу исключать все лицевые стороны, установив javax.faces.FACELETS_REFRESH_PERIOD в web.xml. Единственный способ, о котором я могу подумать, - это получить доступ к кэшу JSF-граней с помощью отражений и удалить эти записи из concurrentHashMap (Not Preferred).