从webservice下载大文件导致应用程序性能问题

时间:2016-10-27 16:34:28

标签: java spring web-services spring-ws

我已经阅读了之前的帖子并且提出了类似的问题,但我无法找到解决问题的方法。 在我的应用程序中,用户可以下载文件,因此当用户点击下载时,我们的应用程序服务器在内部设置了与Web服务进行身份验证的会话,该服务在XML响应中发送文件数据,如下所示:

<FileSerial xmlns="http://my.example.com/webservices">
  <filedata>base64Binary</filedata>
  <filesize>int</filesize>
  <filetype>string</filetype>
  <mime_type>string</mime_type>
</FileSerial>

我使用了 spring-ws ,如下所示:

 GetDocResponse docResponse = (GetDocResponse) webServiceTemplate.marshalSendAndReceive(getDoc);
FileSerial fileSerial = docResponse.getGetDocResult();
fileByte = fileSerial.getFiledata();

在几个用户点击下载后,我们的应用服务器JVM内存非常高,应用服务器没有响应,必须重新启动。 我的猜测是fileByte存储在我的应用程序服务器内存中,这导致了问题。

有没有办法直接流入客户端浏览器而不将其存储在应用程序服务器内存中。

任何示例代码都会有所帮助。

1 个答案:

答案 0 :(得分:1)

您正在加载堆上的完整文档,以及转换为base64。如果不使用引用复制,则从二进制数据到其他对象的每个映射都会在堆上创建另一个条目。

您应该使用多部分请求并将文档作为ws请求的附件发送 MTOM example