Block wiederholt Anfragen in Wicket
Den wicket-Seite ist links, aktiviert durch das drücken einer numerischen Taste.
onClick()
Methode ruft Datenbank-Logik zum speichern einiger Werte.
Das problem erscheint, wenn der Benutzer die Taste drückt, kontinuierlich und wicket, erhält noch eine bitte, bevor es das erste fertig. Das Ergebnis ist StalePageException
.
org.apache.wicket.request.mapper.StalePageException
at org.apache.wicket.request.handler.PageProvider.getStoredPage(PageProvider.java:301)
at org.apache.wicket.request.handler.PageProvider.resolvePageInstance(PageProvider.java:257)
at org.apache.wicket.request.handler.PageProvider.getPageInstance(PageProvider.java:165)
at org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.getPage(ListenerInterfaceRequestHandler.java:100)
at org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:165)
at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:784)
at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:255)
at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:212)
at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:283)
at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:188)
at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:244)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Die Frage ist, wie filtern alle Anfragen, bis die erste fertig ist?
- Haben Sie versucht, übergeordnete
isVersioned()
und die Rückkehrtrue
im ZielPage
? - Danke für die Antwort! Ja, ich habe versucht, diese aber noch nicht erfolgreich. Die Zielseite ist die gleiche. Außerdem wäre es toll, filtern diese Anfrage, die irgendwo auf der oberen Ebene. Mai werden in
RequestCycleListener
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ähnliche Fragen gestellt zu haben, bevor Sie in die wicket-user-Listen, und die Antwort war, deaktivieren Ihre Komponenten/verhindern, dass weitere Interaktion bis die Anfrage beendet.
In deinem Fall nur das entfernen/blockieren
onClick()
's Verhalten wäre genug.Erwähnenswert ist auch, dass, wenn die Ajax-requests werden, können Sie eine drop-Verhalten, so dass in einem Szenario, in dem mehrere Anfragen gesendet werden, nur der Letzte bearbeitet wird. Sie können erreichen, dass durch das überschreiben
AbstractDefaultAjaxBehavior.getChannelName()
und der Rückkehr, alles endet mit|d
.Daemon Thread ["http-bio-81"-exec-320] (Running) Daemon Thread ["http-bio-81"-exec-322] (Running) Daemon Thread ["http-bio-81"-exec-323] (Running) Daemon Thread ["http-bio-81"-exec-324] (Running) Daemon Thread ["http-bio-81"-exec-325] (Running)
und früher oder später (wenn die Taste noch gedrückt) führt zuorg.apache.wicket.page.CouldNotLockPageException: Could not lock page 1523. Attempt lasted 1 minute at ...
onClick()
ein flag setzen, dass würde verhindern, dass sich aus der Ausführung wieder, und wenn die erste Anforderung wird, bei page-reload, reset, wie die Flagge? Ich weiß, das geht nicht auf die durch das filtern der Anfragen ein Problem, was btw ich bin mir nicht bewusst, wie Sie zu beheben 🙂