java - numberOfViewsInSession 和多个选项卡的问题

标签 java jsf jakarta-ee richfaces lifecycle

我的应用程序和内存有很大问题。该应用程序(带有 jsf/richfaces/facelet 的 java)被大约 7000 名用户同时使用。

默认情况下,变量 com.sun.faces.numberOfViewsInSession 在 web.xml 中设置为 15。此变量创建 View 树,jsf 在向后点击 15 次期间检索特定 View 。

例如,我有一个应用程序有 3 个屏幕,并且我使用 firefox。我进入第一个选项卡的第三个屏幕。在第二个选项卡中,我有第一个屏幕,然后单击下一步按钮,jsf 检索第一个屏幕并转到第二个屏幕。

这种机制很棒,但它会消耗大量内存(对我来说每个 session 25Mo),当你将这个数字乘以 7000 时,我需要 175 Go 内存,这是不可能的。

所以我尝试将 com.sun.faces.numberOfViewsInSession 设置为 1(3Mo by session)。

但是在我的例子中,当我点击下一个按钮的第二个选项卡时,我得到了下一个错误:

javax.servlet.ServletException: viewId:/private/pages/data/dataView.faces - View /private/pages/data/dataView.faces could not be restored.
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:270)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at fr.generali.mezzo.front.commun.performance.filters.PerformanceFilter.doFilter(PerformanceFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:420)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:595)

这个错误是合乎逻辑的,因为我的 numberOfViewsInSession 是 1。

所以,我的问题是:

鉴于我知道 View 中的数据(对于第二个选项卡),我该如何捕获异常并为我的用户创建新 View ?

感谢您的帮助。

最佳答案

利用您对应用程序的特定知识手动恢复 View 可能不是胆小者的任务。

如果您想遵循该路径,我认为您不应该 try catch 异常,而应该利用 JSF 中的 StateManager API。这允许您自定义 JSF 框架管理其 View 状态的方式。

请注意,这是一个高级主题。或者用 Ed Burns(JSF 规范负责人)的话来说:

View state management is a complex business, and few application developers will have to worry about customizing it.

就是说,如果您还没有使用 JSF 2.0,那么我强烈建议您升级到这个版本。 JSF 2.0 中的一个重要新特性是部分状态保存。这大大减少了存储状态所需的内存量。

我猜您可能已经考虑过另一种选择,因为您了解诸如 com.sun.faces.numberOfViewsInSession 之类的参数,它正在客户端上使用状态。这将 View 状态存储在隐藏字段中,并且基本上为您提供了无限的内存,因为客户端用作分布式内存。当然,这是以增加网络开销为代价的。在 AJAX 的情况下,这种开销可能大到无法考虑。

关于java - numberOfViewsInSession 和多个选项卡的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4547424/

相关文章:

java - Tomcat 7 - 无法找到 mysql 驱动程序

java - IPBoard 密码哈希问题,与算法不匹配

java - 从数据库获取数据的有效方法

java - session 过期时的授权重定向不适用于提交 JSF 表单,页面保持不变

java - Spring中的刷新属性占位符机制

java - 单独项目中的 Google App Engine 实体未进行数据增强

spring - 来自多个数据库表的 JSF 数据表列

javascript - JSF Richfaces 自动完成问题 - 使用..anything 发送隐藏参数

java - JPA EntityManager 未注入(inject) Java EE 应用程序

java - J2EE 7 Rest 客户端中的属性而不是值