我们正在使用使用AJAX的Wicket编写应用程序。该应用程序有一个主窗口,其中包含两个iFrame。第一个iFrame显示带有地图的页面(Google地图)。第二个iFrame显示了一个DataTable。
主窗口始终可见。有些页面在自己的窗口中打开(弹出窗口)。窗口将重复用于同一页面,例如,如果已经为该链接打开了一个弹出窗口,则链接-A将重用相同的弹出窗口。
我们遇到的问题是,当我们开始'组合'AJAX调用并加载新页面时,我们开始获取PageExpiredException
- s用于AJAX调用。加载页面(没有AJAX)工作正常,AJAX调用是问题。以下是典型情况:
PageExpiredException
。 所有这些都可以在登录后的一分钟内发生(新会话),这意味着会话仍然有效。
我们并不确切地知道问题是什么,但我们设法通过增加maxSizePerPageSession
中DefaultPageManagerProvider
的值来“延迟”获取此异常。查看Wicket的源代码,最后DataStore
/ PageWindowManager
使用此值。
我们认为这不是最佳解决方案,我们希望了解问题所在,以便我们能够以更好的方式解决问题。
我们正在使用Wicket 1.5-RC2。
这是堆栈跟踪:
org.apache.wicket.protocol.http.PageExpiredException:Page expired。 在org.apache.wicket.request.handler.PageProvider.getPageInstance(PageProvider.java:164) at org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.getPage(ListenerInterfaceRequestHandler.java:89) at org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:141) at org.apache.wicket.request.cycle.RequestCycle $ HandlerExecutor.respond(RequestCycle.java:706) 在org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:63) 在org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:212) 在org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:253) 在org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:138) 在org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:194) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383) 在org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:284) 在org.apache.coyote.http11.Http11AprProtocol $ Http11ConnectionHandler.process(Http11AprProtocol.java:322) 在org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.run(AprEndpoint.java:1684) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source) 在java.lang.Thread.run(未知来源)
答案 0 :(得分:0)
这是该http会话的文件窗口的最大大小。到达它之后,Wicket开始覆盖最旧的页面版本。 在某一时刻达到此阈值并删除具有版本1(初始页面)的页面,而是编写具有版本N的页面。稍后,Ajax调用尝试查找包含具有此ajax行为的组件的页面,并且此查找失败。
另一种解决方案是通过不时地对页面进行ping操作来保持版本“活着”,例如,使用AjaxSelfUpdatingTimerBehavior。
答案 1 :(得分:0)
像Martin建议的那样保持页面“活着”并不容易,有一张我们无法重新加载的地图(许可问题)。进一步的测试表明,我们只需刷新主页的一些组件几次就可以获得PageExpiredException。主页每5秒刷新一些组件(AJAX)。一段时间后,应用程序因为PageExpiredException而崩溃。我认为此问题可能与此问题有关:https://issues.apache.org/jira/browse/WICKET-3667。有什么工作吗?
由于
Mauricio Lopez-Soto
答案 2 :(得分:0)
我也遇到了这个问题。我不知道这个问题的答案,但我刚刚创建了一个Wicket JIRA问题:https://issues.apache.org/jira/browse/WICKET-4186 让我们跟踪那里的进展。