2013-06-20 4 views
2

У меня есть приложение Struts2, действие которого может занять от 1 секунды до 5 минут. Итак, я использую перехватчик execAndWait для отображения страницы ожидания, если для выполнения действия требуется более 20 секунд. Настройка действия выглядит так:Struts 2 - execAndWait

<action name="myAction" class="myActionClass"> 
    <interceptor-ref name="defaultStack" /> 
    <interceptor-ref name="execAndWait"> 
     <param name="delay">20000</param> 
    </interceptor-ref> 
    <result name="success">myPage.jsp</result> 

    <result name="wait">waitPage.jsp</result> 
</action> 

Я протестировал это со сценарием, в котором действие занимает всего 1 секунду. Я ожидал, что страница ожидания никогда не будет показана.

Однако страница ожидания все еще обнаруживалась. Я попытался отладки мой класс действия и метод, и обнаружил, что выполнение висит в этом заявлении ниже в течение времени, указанного в

<param name="delay"> 

В этом случае, он ждет 20 секунд в заявлении ниже, а затем завершает выполнение успешно.

getSession().put(A_SESSION_VARIABLE, 10); 

Примечание: MyActionClass ли реализовать SessionAware

Кто-нибудь еще возникла эта проблема? Есть ли для этого работа?

ответ

2

Обходной путь (если ваше действие используется в среде сервлетов): используйте интерфейс ServletRequestAware и используйте HttpServletRequest, чтобы получить сеанс.

request.getSession().setAttribute(A_SESSION_VARIABLE, 10); 
+0

Спасибо, Александр. Оно работало завораживающе. Цените свой ответ !!! –

+0

@MathewGeraldo: Не забудьте принять ответы, которые помогли вам и upvote, если у вас достаточно репутации. –

+0

Я борюсь за это решение с одного дня. Тем не менее, я не понял, почему это происходит. @ AleksandrM Пожалуйста, дайте нам понять, почему это происходит. Это более полезно. – udaybhaskar

0

У меня есть другой подход к этой проблеме. Вы можете выполнить тяжелую обработку в отдельном потоке и немедленно вернуть ответ пользователю, указав, что работа выполняется. Когда работа закончена, вы можете вернуть все, что хотите вернуть пользователю. Этого можно добиться, используя опрос.

В то же время пользователю не нужно ждать и делать другие вещи.

Надеюсь, это поможет.

+0

+1, я делаю то же самое с сердцебиением JQuery опрашивать Действие AJAX, что чтение из сессии общий объект обновляется продолжительном действий –

+0

Параметр 'execAndWait' перехватчик работает в отдельном потоке. –