2010-12-28 13 views
6

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.

Respuesta

10

Restaurar la vista manualmente explotando el conocimiento específico que tiene sobre su aplicación quizás no sea una tarea para los pusilánimes.

Si desea seguir ese camino, creo que no debe intentar detectar la excepción, sino aprovechar la API StateManager en JSF. Esto le permite personalizar la forma en que el marco JSF gestiona su estado de vista.

Tenga en cuenta que este es un tema avanzado. O en palabras Ed Burns (JSF especificación de plomo):

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

Dicho esto, si no está ya utilizando JSF 2.0, entonces le recomiendo actualizar a esta. Una gran característica nueva en JSF 2.0 es Parcial State Saving. Esto reduce drásticamente la cantidad de memoria necesaria para almacenar el estado.

Sin embargo, otra opción, que supongo que ya habrías considerado verte conocer los parámetros como com.sun.faces.numberOfViewsInSession está usando state en el cliente. Esto almacena el estado de la vista en campos ocultos, y básicamente le da una memoria ilimitada ya que el cliente se usa como memoria distribuida. Por supuesto, esto tiene el costo de una mayor sobrecarga de red. En el caso de AJAX, esta sobrecarga podría ser tan grande que sea imposible de considerar.

+0

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

+0

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. –

Cuestiones relacionadas