Файл не загружается с помощью execAndWait Struts Interceptor после вставки задержки

Мой код загружает файл с внутреннего сервера. Поскольку мы будем извлекать записи, исчисляемые миллионами, мы использовали Struts2 execAndWait Interceptor. Чтобы проверить это, мы вставляем задержку в 30 секунд. Я могу загрузить файл без задержки вставки (где тестовые данные очень маленькие), но после его вставки я никогда не получаю файл. Журналы показывают, что класс действий выполняется повторно из-за <meta-refresh> из 5 секунд в файле ожидания, даже заполняется входной поток.

В чем может быть причина такого поведения?

Настройка кода:

Struts.xml:

<action name="file-download" class="com.company.namespace.test.TestDownloadActionClass">
     <interceptor-ref name="defaultStack" />
     <interceptor-ref name="execAndWait">
         <param name="delay">10000</param>
         <param name="delaySleepInterval">500</param>
     </interceptor-ref>
     <result name="wait" type="freemarker" >/dir/resources/First-Page.ftl</result>
     <result name="error" type="freemarker" >/dir/resources/Error-Page.ftl</result>
     <result name="success" type="stream">
        <param name="contentDisposition">attachment; filename="${downloadFilename}"</param>
        <param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</param>
        <param name="inputName">inputStream</param> 
        <param name="bufferSize">1024</param>
    </result>
</action>

P.S. Я не тестировал этот код на миллионах наборов данных. Тестовые данные состоят только из нескольких данных.


person Sourabh    schedule 23.02.2015    source источник


Ответы (1)


Причина в том, что вы используете Перехватчик выполнения и ожидания неправильным образом. Перехватчик выполняет действие в фоновом потоке. Пока действие выполняется, что может занять много времени, результат wait возвращается в браузер. Когда результат выполнен, ответ фиксируется. Результат wait возвращается после указанного параметра delay.

Параметры:

  • delay (необязательно) — начальная задержка в миллисекундах для ожидания перед отображением страницы ожидания (возврат ожидания в качестве кода результата). По умолчанию нет начальной задержки.
  • delaySleepInterval (необязательно) - используется только с задержкой. Используется для пробуждения через определенные промежутки времени, чтобы проверить, завершен ли уже фоновый процесс. По умолчанию 100 миллисекунд.

Результат wait не возвращается, если начальный параметр delay достаточно велик для завершения задания.

Этот перехватчик также поддерживает использование начальной задержки ожидания. Начальная задержка — это время в миллисекундах, которое мы позволяем серверу ждать, прежде чем страница ожидания будет показана пользователю. Во время ожидания этот перехватчик будет просыпаться каждые 100 миллисекунд, чтобы проверить, не выполняется ли фоновый процесс преждевременно, поэтому, если задание по какой-то причине не занимает много времени, страница ожидания не отображается пользователю.

person Roman C    schedule 24.02.2015
comment
Привет @Roman, я получаю страницу ожидания, так как задержка составляет 10 секунд. Но я не могу загрузить файл, который предположительно заполняется и отправляется из бэкэнда. Во время этого мое ожидание также постоянно обновляется, поэтому каждый раз вызывается execute(). Таким образом, цикл обновления происходит постоянно, при этом файл не загружается. Что-то не так в конфигурации распорок? - person Sourabh; 24.02.2015
comment
Если я удалю перехватчик execAndWait, в случае миллиона или более записей, не истечет ли сеанс http на сервере? Чтобы решить эту проблему, я использовал interceptor. - person Sourabh; 24.02.2015
comment
Хорошо, я понял вашу точку зрения, если у вас есть другие вопросы, отредактируйте свой пост или задайте новый вопрос, если у вас другая проблема. - person Roman C; 24.02.2015