2013-06-26 24 views
0

我使用Jersey作爲我的REST實現,JAXB用於表示我的類。 我已經做了一個小文件傳輸機制。在客戶端,在將其設置爲JAXB對象之前,該文件將轉換爲BASE64字符串。 JAXB對象隨後被髮送到澤西島的服務器。使用Jersey發送大型JAXB對象會生成OutOfMemoryError

它適用於大小不超過50 MB的文件,但當我嘗試發送500 MB文件時,我的客戶端上會收到OutOfMemoryError。我已將-Xms-Xmx設置爲2048米,但它沒有幫助,但我仍然收到錯誤消息。

我能做些什麼來使它處理非常大的文件?

回答

1

重寫整個東西以流式傳輸文件。不要base64編碼它,不要使用JAXB,也不要將它嵌入到XML中。即使文件大小爲900 TB,也能正常工作。如果必須的話,在澤西島以外的地區實施。使用正文流式傳輸文件字節的HTTP GET結果。您可以在許多servlet教程的介紹中找到實現此示例的servlet示例。

+0

我會嘗試使用'HttpUrlConnection'來上傳/下載文件。我猜它的Content-Type應該是HTTP頭中的「application/octet-stream」。 – Rox

+0

在客戶端,您*可能*仍然能夠使用相同的API。一些WS客戶端API具有獲取底層請求的機制或getInputStream()方法。客戶端可以從那裏讀取流。是的,這是在服務器端設置的正確內容類型。如果您想使用瀏覽器進行測試,請考慮設置內容處置標頭:http://stackoverflow.com/questions/1012437/uses-of-content-disposition-in-an-http-response-header這樣Web瀏覽器會提示你保存文件的位置,而不是試圖顯示它。 – Keith

+0

我忘了提及我正在使用豐富的應用程序而不是Web表單來發送文件。如果我失敗,我會明天嘗試'HttpUrlConnection'並返回這裏。 :-) – Rox

1

Webservices不用於傳輸大量數據;它們被設計用於進程間通信。文件傳輸你使用特定的協議,如FTP。如果我不得不設計這樣的事情,我會分兩步做。使用FTP列表項

  • 調用Web服務調用來告訴這些文件是否存在
  • 但是你可以嘗試(對於FTP或JSCH爲SFTP阿帕奇commons.net)

    1. 上傳文件(S)這個example使用Jersey Client上傳大文件。