2016-06-15 4 views
0

그래서 상황은 다음과 같습니다. 자바 스윙 응용 프로그램에서 spring 웹 응용 프로그램을 실행중인 glassfish 4 서버로 파일을 성공적으로 업로드 할 수 있습니다.느린 파일 업로드 속도 글래스 피시의 httpclient에서 봄 mvc

내 문제는 업로드하는 데 영원히 걸립니다 !!! 웹에서 속도를 높이거나 낮추는 데 많은 요소가 있다는 것을 알고 있습니다. 난 단지 내 코드가 느린 지점이 아닌지 확인하고 싶다. 1.7MB의 내 테스트 파일에 대해

, 그것은 업로드에 대한 14초 평균 소요됩니다. 내 ISP에 따르면 megapath 속도 테스트에 의해 확인, 나는 매우 일관된 50 MB/s 연결을 두 가지 방법으로있다.

파일 업로드와 관련하여 동일한 작업을 수행하는 데는 여러 가지 방법이 있습니다. 나는 UI 개발자이고 파일 xfer는 나를 위해 새 것 ... 나는 업로드 프로세스가 작동하기에 충분한 시간을 가졌다. 문제 해결/최적화를 시작할 위치를 어디서 찾아야할지 모르겠다.

들어오는 파일을 처리하는 스프링 컨트롤러의 관련 메서드는 물론 클라이언트에서 파일을 보내는 코드도 포함 시켰습니다. (아파치의 HTTP 클라이언트 라이브러리를 사용하여, 클라이언트 코드)

CloseableHttpClient httpclient = HttpClients.createDefault(); 

long start = System.currentTimeMillis(); 

// request bean to JSON string 
ObjectMapper mapper = new ObjectMapper(); 
String requestBeanAsJSON = mapper.writeValueAsString(requestBeanToSend); 

HttpPost outgoingPostRequest = new HttpPost(serverURL); 

FileBody fileBody = new FileBody(fileToSend, ContentType.DEFAULT_BINARY); 
StringBody stringBody1 = new StringBody("msg", ContentType.MULTIPART_FORM_DATA); 

MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
builder.addPart("upfile", fileBody); 
builder.addPart("text1", stringBody1); 
HttpEntity entity = builder.build(); 

outgoingPostRequest.setEntity(entity); 

CloseableHttpResponse responseBody = httpclient.execute(outgoingPostRequest); 


long end = System.currentTimeMillis(); 

System.out.println("completed in " + ((end-start)/1000) + " seconds."); 

(서버 코드를 (필자는 파일과 함께 JSON의 형태로 파일에 대한 메타 데이터를 전송하고 있음을 유의하시기 바랍니다) 봄, glassfish4)

@RequestMapping(method = RequestMethod.POST, value = "up") 
public @ResponseBody MyReturnObject handleFileUpload(@RequestParam("file") MultipartFile file) 
{ 
    try 
    { 

     BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(FtConstants.getTempUploadBaseDir() + File.separator + uniqueToken + "." + FileUtils.getFileExtension(file.getOriginalFilename())))); 
      FileCopyUtils.copy(file.getInputStream(), stream); 
      stream.close(); 

    } 
    catch(Exception e) 
    { 

    } 

    MyReturnObject returnObject = new MyReturnObject(); 
    returnObject.setToken( RandomStringUtils.randomAlphanumeric(16)); 
    return returnObject; 
} 

은 아무것도 내가 잘못 것을 눈부신 있습니까? 내가 위에서 말했듯이, 그것은 효과가 있지만 사악하다.

미리 도움을 청하십시오!

+0

왜 파일을 복사하기 위해'BufferedOutputStream'을 사용하고 있습니까? 'FileCopyUtils.copy (file.getInputStream(), new FileOutputStream ("theCopiedFile.txt")); 또는 단순히'copy (byte [] in, File out)'메서드 만 수행 할 수 있습니까? – Jaumzera

+0

@Jaumzera - 그다지 큰 차이는 없습니다. –

+0

@Stephen C, 여기 내 테스트에 따르면 BufferedOuputStream이 214MB 파일을 복사하는 데 500 밀리 초 (평균)가 걸리지 만 비 버퍼링 된 대체 방법을 사용하면 50 밀리 초가 소요됩니다. 나는 10x가 관련이 있다고 생각한다. 그렇지 않니? 물론 내 하드웨어 사양을 고려하십시오. – Jaumzera

답변

1

내가 잘못하고있는 것이 눈부십니까?

물어 본 결과 ... 이것은 분명히 잘못되었습니다! 그것은 squashes 및 모든 예외 (Error 및 그 서브 클래스 제외).

catch(Exception e) 
{ 

} 

전송 속도에는 영향을 미치지 않지만 다양한 운영상의 문제와 버그를 숨길 수 있습니다.

코드에서 전송 속도에 영향을주는 문제는 볼 수 없습니다. CPU 및 네트워크 성능 도구를 사용하여 조사를 시작합니다.

+1

stephen C : 의견을 주셔서 감사합니다 ... 저는 회사의 특정 코드를 제거하고 해당 코드를 완벽하게 남겨 둬야했습니다. – cotfessi

0

내가 잘못하고있는 것이 무엇인가?

다음의 외모 나에게 의심 : 클라이언트의

당신이를 통해 다중 업로드의 파일 부분을 만듭니다

builder.addPart("upfile", fileBody); 

하지만 컨트롤러를 찾고 있습니다 :

@RequestParam("file") 

대신

@RequestParam("upfile") 

위에서 지적한 바와 같이 예외가 발생하여 더미 무작위 응답을 반환하는 것으로 생각됩니다. 파일이 실제로 업로드되었는지 확인 했습니까?

+0

감사합니다! 그 차이를 알아 채지 못했지만 파일이 업로드 된 후 다운로드하여 내가 기대하는 바를 얻도록 해시를 확인할 수 있습니다. – cotfessi