我的代码从后端服务器下载文件。由于我们将检索数以百万计的记录,因此我们使用了 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:我还没有在百万个数据集上测试过这个代码。测试数据仅包含少量数据。
execAndWait
拦截器。拦截器正在后台线程中运行一个操作。执行操作时,可能需要很长时间,wait
结果会返回到浏览器。当结果被执行时,响应被提交。指定参数wait
后返回delay
结果。
参数:
(可选)- 在显示等待页面之前等待的初始延迟(以毫秒为单位)(以结果代码形式返回等待)。默认为否 初始延迟。delay
(可选)- 仅在延迟时使用。用于每隔一段时间唤醒一次,检查后台进程是否正在运行 已经完成了。默认值为 100 毫秒。delaySleepInterval
如果初始
wait
参数足够大以完成作业,则不会返回 delay
结果。
该拦截器还支持使用初始等待延迟。一个初始的 延迟是我们让服务器在等待之前等待的时间(以毫秒为单位) 页面显示给用户。在等待期间,该拦截器将被唤醒 每 100 毫秒检查一次后台进程是否过早完成, 因此,如果由于某种原因该作业不需要很长时间,则等待页面是 不向用户显示。