我们正在将动态内容(从DB检索到)添加到JSF页面;每次遇到标签时,标签处理程序都会基于id检索内容并生成唯一的url,然后通过调用includeFacelet将内容添加到FaceletContext中
在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,如页面Include dynamic content containing JSF tags/components from stream
所示这里的问题是所有唯一的url都已添加到JSF facelet缓存中,并且它们永不过期。 JVM堆大小正在增长,并且内存不足。这些URL绝不会被JSF Facelet缓存引用,因此不会被垃圾收集。
是否有人知道将某些Facelets排除在添加到JSF Facelet缓存之外,或者以任何方式从JSF缓存中删除那些Facelets?
我不想通过在web.xml中设置javax.faces.FACELETS_REFRESH_PERIOD来排除所有facelets。我能想到的唯一方法是使用反射访问JSF facelets缓存,并从parallelHashMap中删除这些条目(不是首选)。