2010-12-28 11 views
6

Ich habe ein großes Problem mit meiner Anwendung und dem Speicher. Die Anwendung (Java mit JSF/Richfaces/Facelet) wird von einigen 7000 Benutzern gleichzeitig verwendet.Problem mit NumberOfViewsInSession und mehrere Registerkarten

Standardmäßig ist die Variable com.sun.faces.numberOfViewsInSession in der web.xml auf 15 eingestellt. Diese Variable erstellt einen Baum von Ansichten und jsf ruft eine bestimmte Ansicht während 15 Klicks rückwärts ab.

Zum Beispiel habe ich 3 Bildschirme für eine Anwendung und ich benutze Firefox. Ich gehe im dritten Bildschirm in einem ersten Tab. In einem zweiten Tab habe ich den ersten Bildschirm und ich klicke auf den nächsten Knopf, jsf den ersten Bildschirm und gehe zum zweiten.

Dieser Mechanismus ist großartig, aber es verbraucht viel Speicher (25Mo für Sitzung) und wenn Sie diese Zahl um 7000 multiplizieren, brauche ich 175 Go Speicher, es ist unmöglich.

Also habe ich versucht, com.sun.faces.numberOfViewsInSession gleich 1 (3Mo nach Sitzung) zu setzen.

Aber mit meinem Beispiel, wenn ich auf der nächsten Taste in dem zweiten Registerkarte klicken bekomme ich die nächsten Fehler:

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) 

Dieser Fehler ist logisch, weil mein numberOfViewsInSession 1.

So ist mein Frage ist:

Da ich Daten kenne, die in der Ansicht sind (für die zweite Registerkarte), wie kann ich tun, um die Ausnahme abzufangen und eine neue Ansicht für meinen Benutzer erstellen?

Danke für Ihre Hilfe.

Antwort

10

Die manuelle Wiederherstellung der Ansicht durch Ausnutzung der spezifischen Kenntnisse, die Sie über Ihre Anwendung haben, ist vielleicht keine Aufgabe für schwache Nerven.

Wenn Sie diesem Pfad folgen möchten, sollten Sie nicht versuchen, die Ausnahme abzufangen, sondern die API StateManager in JSF zu nutzen. Auf diese Weise können Sie anpassen, wie das JSF-Framework seinen Ansichtszustand verwaltet.

Beachten Sie, dass dies ein erweitertes Thema ist. Oder in Ed Burns (JSF-Spezifikation Blei) Wörter:

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

Das heißt, wenn Sie nicht bereits JSF 2.0 verwenden, dann empfehle ich ein Upgrade auf diese. Eine große neue Funktion in JSF 2.0 ist Partial State Saving. Dies reduziert die zum Speichern des Zustands erforderliche Speichermenge drastisch.

Noch eine Option, die Sie möglicherweise bereits in Betracht gezogen haben Sie zu sehen, haben Sie Kenntnisse von Parametern wie com.sun.faces.numberOfViewsInSession verwendet Status auf Client. Dadurch wird der Ansichtszustand in ausgeblendeten Feldern gespeichert, und Sie erhalten einen unbegrenzten Speicher, da der Client als verteilter Speicher verwendet wird. Natürlich kommt dies zu teuren erhöhten Netzwerk-Overhead. Im Fall von AJAX könnte dieser Overhead so groß sein, dass es unmöglich ist, darüber nachzudenken.

+0

Danke für Ihre Antwort sehr lehrreich. Ich kann "client" -Save-Methode verwenden, weil ich viele AJAX-Anfragen habe. Haben Sie ein Tutorial über StateManager API? Ich benutze JSF 1.2 und ich kann die Version jetzt nicht aktualisieren. – Kiva

+0

Es gibt einige Anweisungen in JavaServer Faces die komplette Referenz von Ed Burns, aber ich würde diese nicht ausführlich nennen. Sonst musst du nur um den Begriff rumspielen, den ich dir gegeben habe. –