2012-05-11 2 views
6

을 작동하지 않습니다 :response.flushBuffer는() 나는 큰 개체를 스트리밍 서블릿을 구현하기 위해 노력하고

oracle.sql.BLOB blob = rs.getBLOB('obj'); 
    InputStream in = blob.getBinaryStream(); 

    int bufferSize = 1024; 
    byte[] buffer = new byte[bufferSize]; 

    ServletOutputStream out = response.getOutputStream(); 

    int counter=0 
    while((length=in.read(buffer)) != -1){ 
     out.write(buffer,0,length); 
     counter++; 
     if(counter % 10 == 0){ 
     counter=0; 
     response.flushBuffer(); 
    } 

chunck하여 클라이언트 덩어리로 데이터를 전송하는 가정이 코드. 이제는 대용량 객체 (100MB)를 스트리밍 할 때 메모리가 올라가고 둘 이상의 병렬 다운로드/스트림이있는 경우 서버가 가끔씩 끊어지는 경우가 있습니다.

flushBuffer()이 클라이언트에 데이터를 보내지 않는 이유는 무엇입니까? 클라이언트는 응답이 닫힌 후에 만 ​​파일 열기/저장을위한 팝업을받습니다.

+0

는이 코드 – Madhu

+0

을 테스트 JOBSS 4.3 단절을 사용 너 어딘가에있어. 닫아.()'? – Osw

+0

예 저는 out.close()하지만 여기 붙여 넣지 않았습니다 – Madhu

답변

3

데이터를 쓰기 전에 Content-Length 헤더를 설정해야합니다. 그렇지 않으면 서버는 스트림이 닫힐 때까지 모든 데이터를 버퍼링해야합니다.이 시점에서 값 자체를 계산하고 헤더를 작성하고 데이터. 당신은 아마하지 않도록

response.setHeader("Content-Length", String.valueOf(blob.length())); 

대부분의 서버는이 시점에서 자신을 버퍼 플러시 할만큼 똑똑 : 당신이 모든 데이터를 기록하기 전에 즉시 출력 스트림을 얻을로, 콘텐츠 길이를 설정 flushBuffer()으로 전화해야합니다. 아프지 않아도됩니다. 컨테이너가 알 수 있도록 모든

+1

나는 피곤했다. 그것도 문제가되지 않습니다 :-) – Madhu

+0

환경 설정에 따라'response.setContentLength (blob.length()); – Stuporman

1

첫째, 당신은 얼마나 많은 바이트 수있는 정보 종료 후 servlet 응답에 대한 응답 헤더가 필요합니다 또한

response.setHeader("Content-Length", String.valueOf(blob.length())); 
관련 문제