2014-01-15 57 views
1

有一個運行在嵌入式Jetty容器內的Spring Rest應用程序。 在客戶端上,我使用RestTemplate(嘗試)。如何將大型輸入流發送到Spring REST服務?

使用案例:

有一個InputStream(我沒有文件),我想將它發送到REST服務。

InputStream可能非常大(無字節[]!)。

我試過到目前爲止:

新增StandardServletMultipartResolver給調度上下文;

在servlet的註冊執行:

ServletRegistration.Dynamic dispatcher = ... 
MultipartConfigElement multipartConfigElement = new MultipartConfigElement("D:/temp"); 
dispatcher.setMultipartConfig(multipartConfigElement); 

在客戶端:

restTemplate.getMessageConverters().add(new FormHttpMessageConverter()); 
     MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>(); 
     parts.add("attachmentData", new InputStreamResource(data) { 
      // hacks ... 
      @Override 
      public String getFilename() { 
       //avoid null file name 
       return "attachment.zip"; 
      } 

      @Override 
      public long contentLength() throws IOException { 
       // avoid calling getInputStream() twice 
       return -1L; 
      } 
     } 
ResponseEntity<Att> saved = restTemplate.postForEntity(url, parts, Att.class) 

在服務器:

@RequestMapping("/attachment") 
    public ResponseEntity<Att> saveAttachment(@RequestParam("attachmentData") javax.servlet.http.Part part) { 
     try { 
      InputStream is = part.getInputStream(); 
      // consume is 
      is.close(); 
      part.delete(); 
      return new ResponseEntity<Att>(att, HttpStatus.CREATED); 
     } 
    } 

正在發生的事情: 上傳的InputStream成功地存儲在配置臨時文件夾(MultiPart1970755229517315824),部分零件參數正確注入處理程序方法中。

delete()方法不會刪除文件(smth仍然打開了句柄)。

無論如何它看起來非常難看。

有沒有更流暢的解決方案?

+0

'如果出現錯誤,'Part#delete()'應該拋出'IOException'。可以? –

+0

它依次調用File#delete()並且不檢查返回值,失敗時默默無聞 – Bax

回答

0

你應該使用byte [],然後在webservice上編寫一個包裝來實際發送塊中的「大字符串」。在web服務中添加一個參數,該參數將指示內容的「contentID」,以便對方知道這部分屬於哪個半滿「桶」。另一個參數「chunkID」將有助於對另一側的塊進行排序。最後,第三個參數「isFinalChunk」將被設置,如果你發送的是最終的東西。這是在100行以內的代碼中實現的非常花哨的功能。

唯一的問題是,你最終會對網絡服務進行「n」調用,而不是一次調用,這會聚集連接延遲等。對於實時的東西,需要一些更多的網絡QoS,否則你應該沒事。

我認爲這很簡單,一旦你有你自己的類包裝器來做這個簡單的劈啪和粘貼,如果你的服務器可以處理多個webservice調用,它可以在很大程度上擴展。

+0

這是一個很常見的情況(我猜),是不是有推薦的方法......? – Bax

+0

這種情況的不常見可以從這個陳述中得出:'InputStream可能非常大(沒有byte []!)'它真的太大了,它不適合在一個字節[]!如果它不適合,那麼它確實不是一個常見的情況。陣列可以有很大的長度btw。說完這句話,我的知識可能會很短,無法知道爲此設計的具體實現。 –

+0

那麼,他們可以有幾千兆字節,所以加載到內存似乎很奇怪 – Bax

相關問題