Tengo un gran problema con mi aplicación y la memoria. La aplicación (java con jsf/richfaces/facelet) es utilizada por unos 7000 usuarios simultáneamente.Problema con numberOfViewsInSession y varias pestañas
De forma predeterminada, la variable com.sun.faces.numberOfViewsInSession se establece en 15 en web.xml. Esta variable crea un árbol de vistas y jsf recupera una vista específica durante 15 clics hacia atrás.
Por ejemplo, tengo 3 pantallas para una aplicación y uso Firefox. Voy en la tercera pantalla en una primera pestaña. En una segunda pestaña, tengo la primera pantalla y hago clic en el siguiente botón, jsf recupera la primera pantalla y pasa al segundo.
Este mecanismo es genial pero consume mucha memoria (25Mo por sesión para mí) y cuando multiplicas este número por 7000, necesito 175 Go de memoria, es imposible.
Así que traté de establecer com.sun.faces.numberOfViewsInSession igual a 1 (3Mo por sesión).
Pero con mi ejemplo, al hacer clic en la segunda pestaña en el botón al lado me sale el siguiente error:
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)
Este error es lógico porque mi numberOfViewsInSession es 1.
lo tanto, mi pregunta es:
Dado que sé los datos que están en la vista (para la segunda pestaña), ¿cómo puedo hacer para detectar la excepción y crear una nueva vista para mi usuario?
Gracias por su ayuda.
Gracias por su respuesta muy instructiva. Puedo usar el método de guardar "cliente" porque tengo muchas solicitudes ajax. ¿Tienes un tutorial sobre la api de StateManager? Uso jsf 1.2 y no puedo actualizar la versión ahora. – Kiva
Hay algunas instrucciones en JavaServer Faces, la referencia completa de Ed Burns, pero no las llamaría en profundidad. De lo contrario, tienes que buscar en Google el término que te di, supongo. –