Ho un grosso problema con la mia applicazione e la memoria. L'applicazione (java con jsf/richfaces/facelet) viene utilizzata da circa 7000 utenti contemporaneamente.Problema con numberOfViewsInSession e più schede
Per impostazione predefinita, la variabile com.sun.faces.numberOfViewsInSession è impostata su 15 nel web.xml. Questa variabile crea un albero di viste e jsf recupera una vista specifica durante 15 click all'indietro.
Ad esempio, ho 3 schermate per un'applicazione e utilizzo firefox. Vado in terza schermata in una prima scheda. In una seconda scheda, ho la prima schermata e faccio clic sul pulsante successivo, jsf recupera la prima schermata e passa alla seconda.
Questo meccanismo è ottimo ma consuma molta memoria (25Mo per sessione per me) e quando si moltiplica questo numero per 7000, ho bisogno di 175 passi di memoria, è impossibile.
Così ho provato a impostare com.sun.faces.numberOfViewsInSession uguale a 1 (3Mo per sessione).
Ma con il mio esempio, quando si fa clic nella seconda scheda sul pulsante accanto ottengo l'errore successivo:
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)
Questo errore è logico perché il mio numberOfViewsInSession è 1.
Così, la mia domanda è:
Dato che conosco i dati presenti nella vista (per la seconda scheda), come posso fare per rilevare l'eccezione e creare una nuova vista per il mio utente?
Grazie per il vostro aiuto.
Grazie per la vostra risposta molto istruttiva. Posso usare il metodo di salvataggio "client" perché ho molte richieste di ajax. Hai un tutorial su stateManager api? Io uso jsf 1.2 e non posso aggiornare la versione ora. – Kiva
Ci sono alcune istruzioni in JavaServer Facce il riferimento completo di Ed Burns, ma non le chiamerei approfondite. Altrimenti devi solo Google in giro sul termine che ti ho dato credo. –