2010-12-28 16 views
6

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.

risposta

10

Ripristinare la vista manualmente sfruttando le conoscenze specifiche che si hanno sulla tua applicazione non è forse un compito per i deboli di cuore.

Se si desidera seguire tale percorso, penso che non si debba tentare di rilevare l'eccezione, ma di sfruttare l'API StateManager in JSF. Ciò consente di personalizzare il modo in cui il framework JSF gestisce il suo stato di visualizzazione.

Si noti che questo è un argomento avanzato. O in Ed Burns' (JSF piombo spec) parole:

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

Detto questo, se non si sta già utilizzando JSF 2.0, quindi mi raccomando l'aggiornamento a questo. Una grande novità in JSF 2.0 è Risparmio parziale stato. Questo riduce drasticamente la quantità di memoria necessaria per memorizzare lo stato.

Un'altra opzione, che presumo potreste aver già considerato di aver visto la conoscenza di parametri come com.sun.faces.numberOfViewsInSession, sta utilizzando lo stato sul client. Questo memorizza lo stato di visualizzazione nei campi nascosti e in pratica ti dà una memoria illimitata poiché il client viene utilizzato come memoria distribuita. Ovviamente questo è costoso a causa dell'aumento dei costi di rete. Nel caso di AJAX questo overhead potrebbe essere così grande da essere impossibile da considerare.

+0

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

+0

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