1

我的代码从后端服务器下载文件。由于我们将检索数以百万计的记录,因此我们使用了 Struts2execAndWait拦截器。为了测试这一点,我们插入了 30 秒的延迟。我能够在不插入延迟的情况下下载文件(测试数据非常小),但插入后,我再也没有得到文件。日志显示,由于等待文件中的 5 秒,动作类被重复执行<meta-refresh>,即使输入流被填充。

这种行为的原因可能是什么?

代码设置:

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>

PS:我还没有在百万数据集上测试过这段代码。测试数据仅包含少量数据。

4

1 回答 1

0

原因是您以错误的方式使用execAndWait拦截器。拦截器正在后台线程中运行一个动作。在执行操作时,可能需要很长时间,wait结果会返回给浏览器。当结果被执行时,响应被提交。wait指定参数后返回结果delay

参数:

  • delay(可选) - 在显示等待页面之前等待的初始延迟(以毫秒为单位)(返回等待作为结果代码)。默认为无初始延迟。
  • delaySleepInterval(可选)- 仅用于延迟。用于在特定时间间隔唤醒以检查后台进程是否已完成。默认值为 100 毫秒。

如果初始参数大到足以完成作业,wait则不返回结果。delay

此拦截器还支持使用初始等待延迟。初始延迟是以毫秒为单位的时间,我们让服务器在等待页面显示给用户之前等待。在等待期间,此拦截器将每 100 毫秒唤醒一次,以检查后台进程是否过早完成,因此如果由于某种原因该作业不需要很长时间,则不会向用户显示等待页面。

于 2015-02-24T08:10:04.337 回答