Кеширование JSF2 - исключить некоторые лицевые стороны из добавленного в faceletcache - PullRequest
0 голосов
/ 04 сентября 2018

Мы добавляем динамический контент (полученный из БД) на страницу 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).

...