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

Struts2 插入延迟后未使用execAndWait Struts拦截器下载文件,struts2,download,interceptor,struts2-interceptors,interceptorstack,Struts2,Download,Interceptor,Struts2 Interceptors,Interceptorstack,我的代码从后端服务器下载一个文件。因为我们将检索以百万为单位的记录,所以我们使用了Struts2 execAndWait拦截器。为了测试这一点,我们插入了30秒的延迟。 在测试数据非常小的地方,我可以毫不延迟地下载文件,但在插入后,我再也得不到文件。日志显示,由于等待文件中有5秒的时间,操作类被重复执行,甚至输入流也被填充 这种行为的原因可能是什么? 代码设置: Struts.xml: 附言:我还没有在一百万个数据集上测试过这段代码。测试数据只包含少量数据。原因是您以错误的方式使用。拦截器正在后

我的代码从后端服务器下载一个文件。因为我们将检索以百万为单位的记录,所以我们使用了Struts2 execAndWait拦截器。为了测试这一点,我们插入了30秒的延迟。 在测试数据非常小的地方,我可以毫不延迟地下载文件,但在插入后,我再也得不到文件。日志显示,由于等待文件中有5秒的时间,操作类被重复执行,甚至输入流也被填充

这种行为的原因可能是什么? 代码设置: Struts.xml:


附言:我还没有在一百万个数据集上测试过这段代码。测试数据只包含少量数据。

原因是您以错误的方式使用。拦截器正在后台线程中运行操作。执行操作时,可能需要很长时间,等待结果将返回到浏览器。执行结果时,将提交响应。等待结果在指定的参数延迟后返回

参数:

延迟可选-等待页面显示为返回等待结果代码之前等待的初始延迟(毫秒)。默认为否 最初的延迟。 delaySleepInterval可选-仅与delay一起使用。用于每隔一定时间醒来检查后台进程是否正常 已经做了。默认值为100毫秒。 如果初始延迟参数大到足以完成作业,则不会返回等待结果

此拦截器还支持使用初始等待延迟。首字母 延迟是在等待之前让服务器等待的时间(以毫秒为单位) 页面将显示给用户。在等待期间,此拦截器将唤醒 每100毫秒检查一次后台处理是否过早完成, 因此,如果由于某种原因,作业不会花费很长时间,那么等待页面将被删除 未向用户显示


你好@Roman,我正在等待页面,因为延迟大于10秒。但我无法下载文件,该文件应该是从后端填充和发送的。在此期间,我的等待也在不断刷新,从而执行每次点击。因此,刷新周期持续进行,没有下载任何文件。struts配置中有什么错误吗?如果我删除了execAndWait拦截器,在有一百万条或更多记录的情况下,服务器上的http会话不会过期吗?为了解决这个问题,我使用了拦截器。好的,我明白你的意思了,如果你有任何其他问题,请编辑你的帖子,或者如果你有其他问题,请问一个新问题。
<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>