使用Jersey发送大型JAXB对象会生成OutOfMemoryError

时间:2013-06-26 15:57:44

标签: java jaxb jersey out-of-memory

我使用Jersey作为我的REST实现,使用JAXB来表示我的类。 我做了一个小文件传输机制。在我将其设置为JAXB对象之前,在客户端将文件转换为BASE64字符串。然后将JAXB对象发送到带有Jersey的服务器。

它可以处理不超过50 MB左右的文件,但是当我尝试发送500 MB文件时,我的客户端会收到OutOfMemoryError。我已将-Xms-Xmx设置为2048米,但它没有帮助,我仍然收到错误。

如何使用非常大的文件?

2 个答案:

答案 0 :(得分:1)

重写整个内容以流式传输文件。不要base64编码它,不要使用JAXB,不要将它嵌入XML中。即使文件是900 TB也能使它工作。如果必须,在泽西岛以外的地方实施。 HTTP GET导致HTTP响应,文件字节流入正文。您可以在许多servlet教程的介绍中找到实现此功能的示例servlet。

答案 1 :(得分:1)

Webservices不是为传输大量数据而设计的;它们专为进程间通信而设计。您使用FTP等特定协议进行文件传输。如果我必须设计这样的东西,我会分两步完成。

  1. 使用FTP上传文件(用于FTP的apache commons.net或用于SFTP的JSCH)列表项
  2. 调用webservice调用以告知文件在那里
  3. 但是,您可以尝试使用此example使用Jersey客户端上传大文件。