插入延迟后,未使用execAndWait Struts拦截器下载文件



我的代码从后端服务器下载一个文件。由于我们将检索以百万计的记录,因此我们使用了Struts2 execAndWait拦截器。为了测试这一点,我们插入了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>

附言:我还没有在一百万个数据集上测试过这段代码。测试数据仅由少量数据组成。

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

参数:

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

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

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

最新更新