Wicket - получение исключения PageExpiredException при вызовах AJAX. Обычные страницы работают нормально

Мы пишем приложение с использованием Wicket, использующего AJAX. В приложении есть главное окно с двумя iFrames. Первый iFrame показывает страницу с картой (Google Maps). Второй iFrame показывает DataTable.

Главное окно всегда видно. Есть страницы, которые открываются в собственных окнах (всплывающих окнах). Окна повторно используются для одной и той же страницы, например ссылка-A будет повторно использовать одно и то же всплывающее окно, если оно уже открыто для этой ссылки.

Проблема в том, что когда мы начинаем «комбинировать» вызовы AJAX с загрузкой новых страниц, мы начинаем получать PageExpiredException-s для вызовов AJAX. Загрузка страниц (без AJAX) работает нормально, проблема заключается в вызовах AJAX. Ниже приводится типичный сценарий:

  1. Щелкните ссылку-A: откроется страница A во всплывающем окне.
  2. Щелкните ссылку-A 50 раз: при этом страница A откроется 50 раз, используя одно и то же всплывающее окно.
  3. Обновите DataTable в главном окне с помощью AJAX: это вызовет PageExpiredException.
  4. Это максимальный размер файлового окна для этого http-сеанса. После его достижения Wicket начинает заменять самую старую версию страницы. В какой-то момент этот порог достигается, и страница с версией 1 (начальная страница) удаляется, а вместо нее записывается страница с версией N. Позже вызов Ajax пытается найти страницу, содержащую компонент с этим поведением ajax, и этот поиск не выполняется.

Все это может произойти всего через одну минуту после входа в систему (новый сеанс), то есть сеанс все еще действителен.

Мы не знаем точно, в чем проблема, но нам удалось «отложить» получение этого исключения, увеличив значение maxSizePerPageSession в DefaultPageManagerProvider. Если посмотреть на исходный код Wicket, то в конце концов, это значение используется DataStore / PageWindowManager.

Мы не думаем, что это лучшее решение, и хотели бы понять, в чем проблема, чтобы мы могли решить ее лучше.

Мы используем Wicket 1.5-RC2.

Это трассировка стека:

Авторизуйтесь и загрузите главную страницу.


person Mauricio Lopez-Soto    schedule 11.05.2011    source источник


Ответы (3)


Другое решение - поддерживать версию «живой», время от времени проверяя страницу, например с AjaxSelfUpdatingTimerBehavior.

Сохранить страницу «живой», как предложил Мартин, не так просто, есть карта, которую мы не можем перезагрузить (проблемы с лицензированием). Дальнейшее тестирование показывает, что мы получаем исключение PageExpiredException, просто обновляя некоторые компоненты главной страницы несколько раз. На главной странице некоторые компоненты (AJAX) обновляются каждые 5 секунд. Через некоторое время приложение вылетает из-за исключения PageExpiredException. Я считаю, что эта проблема может быть связана с этой проблемой: https://issues.apache.org/jira/browse/WICKET-3667. Любая работа?

person martin-g    schedule 11.05.2011
comment
Мартин, я думаю, это связано с этой проблемой: WICKET-3667. - person Mauricio Lopez-Soto; 12.05.2011
comment
org.apache.wicket.protocol.http.PageExpiredException: срок действия страницы истек. по адресу org.apache.wicket.request.handler.PageProvider.getPageInstance (PageProvider.java:164) по адресу org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.getPage (ListenerInterfaceRequestHandler.java:89) в orwest .handler.ListenerInterfaceRequestHandler.respond (ListenerInterfaceRequestHandler.java:141) в org.apache.wicket.request.cycle.RequestCycle $ HandlerExecutor.respond (RequestCycle.java:706) в org.apache.wick.Request.Request. .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.core.apache. StandardWrapperValve.invoke (StandardWrapperValve.java:240) в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:161) в org.apache.catalina.core.StandardHostValve.invoke (в StandardHostValve.invoke (в StandardHost164) .apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:100) в org.apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.java:541) в org.apache.catalina.core.StandardEngineVal (StandardEngineValve) .java: 118) на org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:383) на org.apache.coyote.http11.Http1 1AprProcessor.process (Http11AprProcessor.java:284) на org.apache.coyote.http11.Http11AprProtocol $ Http11ConnectionHandler.process (Http11AprProtocol.java:322) на org.apache.tomcatEndorpoint.Aprcess.tomcatEndorpoint.Aprcess java: 1684) в java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (Неизвестный источник) в java.util.concurrent. ThreadPoolExecutor $ Worker.run (неизвестный источник) в java.lang.Thread.run (неизвестный источник) - person Mauricio Lopez-Soto; 13.05.2011

Спасибо

Маурисио Лопес-Сото

Я тоже страдаю от этой проблемы. Я не знаю ответа на эту проблему, но я только что создал проблему Wicket JIRA: https://issues.apache.org/jira/browse/WICKET-4186 Давайте отслеживать прогресс там.

person Mauricio Lopez-Soto    schedule 13.05.2011

Мартин, спасибо за ответ. Мы используем большое число (ну, мы думаем, что оно большое) для maxSizePerPageSession. Мы устанавливаем его равным 100000000, но по-прежнему получаем PageExpiredException после того, как основные страницы обновляются несколько раз. Как я упоминал ранее, эти две страницы обновляются с помощью AJAX. Дело в том, что иногда мы получаем исключение сразу после нескольких обновлений, скажем, 20, а в других случаях оно отлично работает для пары сотен. Эти обновления AJAX выполняются автоматически с использованием JS. Я попробую ваше предложение оставить страницу "живой". Спасибо еще раз.

person Martin Vysny    schedule 29.10.2011