插入延迟后,文件未使用execAndWait Struts Interceptor下载

时间:2015-02-23 06:25:15

标签: struts2 download interceptor struts2-interceptors interceptorstack

我的代码从后端服务器下载文件。由于我们将检索数百万的记录,因此我们使用了Struts2 execAndWait拦截器。为了测试这个,我们插入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:我没有在百万数据集上测试此代码。测试数据只包含少量数据。

1 个答案:

答案 0 :(得分:0)

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

  

参数:

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

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

  

此拦截器还支持使用初始等待延迟。最初的   延迟是我们让服务器在等待之前等待的时间(以毫秒为单位)   页面显示给用户。在等待期间,这个拦截器将被唤醒   每100毫秒检查后台进程是否提前完成,   因此,如果由于某种原因的工作没有花很长时间等待页面   没有向用户显示。