Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java numberOfViewsInSession和多个选项卡存在问题_Java_Jsf_Jakarta Ee_Richfaces_Lifecycle - Fatal编程技术网

Java numberOfViewsInSession和多个选项卡存在问题

Java numberOfViewsInSession和多个选项卡存在问题,java,jsf,jakarta-ee,richfaces,lifecycle,Java,Jsf,Jakarta Ee,Richfaces,Lifecycle,我的应用程序和内存有一个大问题。该应用程序(带有jsf/richfaces/facelet的java)同时被大约7000名用户使用 默认情况下,变量com.sun.faces.numberOfViewsInSession在web.xml中设置为15。这个变量创建一个视图树,jsf在15次向后点击期间检索一个特定的视图 例如,我有3个应用程序屏幕,我使用firefox。我进入第一个选项卡的第三个屏幕。在第二个选项卡中,我有第一个屏幕,单击next按钮,jsf检索第一个屏幕并转到第二个屏幕 这个机制

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

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

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

这个机制很好,但是它消耗了很多内存(对我来说是25个会话),当你将这个数字乘以7000时,我需要175次内存,这是不可能的

因此,我尝试将com.sun.faces.numberofviewsin会话设置为1(每个会话3Mo)

但在我的示例中,当我单击“下一步”按钮的第二个选项卡时,会出现下一个错误:

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)
此错误符合逻辑,因为my numberOfViewsInSession为1

所以,我的问题是:

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


感谢您的帮助。

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

如果您希望遵循这条路径,我认为您不应该尝试捕获异常,而是应该利用JSF中的
StateManager
API。这允许您自定义JSF框架管理其视图状态的方式

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

视图状态管理是一项复杂的业务,很少有应用程序开发人员需要担心如何定制它

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


还有另一个选项,我想您可能已经考虑过了,看看您是否了解像
com.sun.faces.numberOfViewsInSession
这样的参数,就是在客户端上使用状态。这将视图状态存储在隐藏字段中,并且基本上为您提供了无限的内存,因为客户端被用作分布式内存。当然,这是由于增加了昂贵的网络开销。在Ajax的情况下,这个开销可能太大了,不可能考虑。

谢谢你的回答,很有启发性。我可以使用“客户机”保存方法,因为我有很多ajax请求。你有关于stateManager api的教程吗?我使用的是JSF1.2,现在无法升级该版本。Ed Burns完全引用了JavaServer中的一些说明,但我不会深入讨论这些说明。否则你就得用谷歌搜索一下我给你的术语。