使用线程下载Servlet文件

时间:2012-06-11 14:27:14

标签: multithreading servlets download

我在下载servlet中遇到了下载文件的问题。

我从httpResponse.getOutputStream()获得了输出流 并将此输出流对象传递给另一个类 - FileOperations 此FileOperations被调用为新线程。当我将文件写入输出流并将其刷新时,会弹出该文件以正确保存它,
但在保存和打开文件时,我看到第一行如下:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Date: Mon, 11 Jun 2012 14:19:37 GMT
2000

在此之后写入文件内容,并在几行之后再次写入'2000'。

请让我知道在线程模式下运行下载可以做些什么。

我尝试在不调用线程的情况下下载文件并正确下载 我将FileOutputStream而不是ServletOutputStream传递给线程,它也正确下载。

1 个答案:

答案 0 :(得分:2)

您不应该从servlet方法传递当前HTTP请求线程之外的HTTP响应。当servlet方法返回时(当线程仍然在后台运行时),容器将立即发送响应。

如果您委托给其他线程,下载速度将不会更快。当前的HTTP请求已由专用线程处理。我建议忘记这种方法,只在当前的HTTP请求线程中执行流作业。这样可以避免您的应用程序创建不必要的线程,而这只会花费更多的资源。

为了提高下载速度,可以更好地重新设计servlet以支持Range个请求。通过这种方式,客户端可以自动或使用某些特定的浏览器插件发送多个If-Range请求以分段下载文件,然后物理上使用多个HTTP连接(因此服务器端有多个HTTP请求/线程) 。然而,这一切并非完全无足轻重。您可以在this blog article中找到此类servlet的具体启动示例。请注意,虽然这种方法理论上可能会提高下载速度,但您仍然会受到网络bandwitdh限制的限制。如果客户端的传入网络带宽比服务器的输出网络宽度更宽,并且服务器(或ISP!)被配置为限制每个连接的带宽,则速度更快。这是在90年代并不罕见,但这些日子并不常见。