0

我的一个报告网页上有“下载到 csv”链接,.csv 文件的典型输出约为 4MB,通常需要大约 5 分钟才能完成运行查询并使用单个线程提供结果。

其中一位用户继续遇到此问题:

[com.jspbook.GZIPResponseWrapper:finishResponse] 异常:java.io.IOException:此输出流已关闭

在服务器日志中还引用了一个损坏的管道异常。

当用户遇到此错误时,我从服务器的角度注意到一切都按时完成。

对于用户,导出链接会无限旋转并且永远不会返回数据。

是什么导致了这个问题,有没有办法保持与浏览器的连接?

4

2 回答 2

1

继续回答@Bhushan Bhangale-

如果服务器响应时间过长,则关闭连接。因此,在处理需要很长时间(创建响应)的这种情况下,选项之一是 -

  1. 收到请求时,在服务器上启动 2 个线程
  2. 一种是在超时间隔前 2-3 秒出现的一种计时器
  3. 另一个实际触发对数据库的查询并创建一个 .csv 文件

请记住,获得请求的主线程必须等到上面启动的线程之一通知它。这可能不是一个好的做法,但在一些奇怪的情况下,没有其他选择。

现在,

1. 如果第一个(定时器)线程在响应准备好之前完成,它只是设置一个标志,并向用户返回一条消息,表明服务器仍在处理请求

2.对于第二个线程,可能有两个条件 -

a. 响应(.csv 文件)在第一个线程设置标志之前准备好,因此它只是发回响应(文件)并取消计时器(第一个)线程
b。如果它发现设置了标志(这意味着响应已经发送),它要么忽略响应(可能是删除文件)或通过电子邮件发送文件(如果可以合并此类功能)

这些线程不能自己发回响应,它们必须通知将响应发送给用户的主线程。您需要设置适当的标志/值,以便主线程知道要发送的响应类型。

希望这可以帮助。

于 2013-04-18T03:58:21.687 回答
1

检查服务器的连接超时设置。等待5分钟是很长的时间。

看起来连接超时或断开。当您的查询完成但连接已关闭时,服务器会尝试写入响应。

如果无法更快地生成,那么当文件通过Web 套接字或来自客户端的连续轮询可用时,请寻求推送给用户。

于 2013-04-18T03:46:30.503 回答