使用Java Spring和Tomcat缓慢并发文件下载

时间:2017-10-02 08:55:29

标签: java spring spring-mvc tomcat optimization

我开发了一个提供REST的Spring MVC项目。 其中一个方法返回一个zip文件的数据。如果数据包很小(10MB以下)或者我们收到的连接很少,那么响应时间就可以了,但是如果我有一个20MB的文件或一百个请求,那么它很慢。这是我的代码:

IOUtils.copy(is, resp.getOutputStream());

我插入了很多日志和#34; reqid"客户端和服务器共享的参数,用于监控每个请求。 当我有多个并发请求时,命令R变得非常慢。如果我发送80个请求,则复制20MB文件需要的时间超过一分钟。

我不认为我的代码存在问题。也许这取决于Spring MVC如何管理@RestController bean?或者是访问磁盘的I / O问题?该系统位于AWS EC2虚拟机上。

2 个答案:

答案 0 :(得分:2)

您实施的是通过直接写入HttpServletResponse OutputStream来下载文件的屏蔽方式。

如果您使用的是Spring 4.2+,则可以返回StreamingResponseBody,它会将文件字节异步流式传输到接收客户端。

有关详细信息,请查看此post和此post

答案 1 :(得分:0)

而不是使用IOUtils.copy(is, resp.getOutputStream());将文件的输入流复制到HttpServletResponse的输出流使用 FileSystemResource来下载客户端的zip文件。< / p>

public FileSystemResource downloadFile(HttpServletResponse response) {
    File file = new File("BASE_PATH/MY_ZIP_FILE.zip");
    response.setContentType("application/zip");      
    response.setHeader("Content-Disposition", "attachment; filename="+"MY_ZIP_FILE.zip");
    return new FileSystemResource(file); 
}