Wicket - 在AJAX调用上获取PageExpiredException。常规页面工作得很好

时间:2011-05-11 19:52:48

标签: ajax exception wicket

我们正在使用使用AJAX的Wicket编写应用程序。该应用程序有一个主窗口,其中包含两个iFrame。第一个iFrame显示带有地图的页面(Google地图)。第二个iFrame显示了一个DataTable。

主窗口始终可见。有些页面在自己的窗口中打开(弹出窗口)。窗口将重复用于同一页面,例如,如果已经为该链接打开了一个弹出窗口,则链接-A将重用相同的弹出窗口。

我们遇到的问题是,当我们开始'组合'AJAX调用并加载新页面时,我们开始获取PageExpiredException - s用于AJAX调用。加载页面(没有AJAX)工作正常,AJAX调用是问题。以下是典型情况:

  1. 登录并加载主页面。
  2. 单击Link-A:这将在弹出窗口中打开Page-A。
  3. 点击链接-A 50次:这将打开Page-A 50次,重复使用相同的弹出窗口。
  4. 使用AJAX刷新主窗口中的DataTable:这将抛出 a PageExpiredException
  5. 所有这些都可以在登录后的一分钟内发生(新会话),这意味着会话仍然有效。

    我们并不确切地知道问题是什么,但我们设法通过增加maxSizePerPageSessionDefaultPageManagerProvider的值来“延迟”获取此异常。查看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(未知来源)

3 个答案:

答案 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 让我们跟踪那里的进展。