2012-05-11 36 views
6

próbuję wdrożyć aplet do strumieniowego przesyłania dużych obiektów:response.flushBuffer() nie działa

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(); 
    } 

Ten kod przypuszczać, aby wysłać dane do kawałka klienta przez chunck. Teraz, gdy przesyłam duży obiekt (100 MB), pamięć rośnie, a serwer umiera czasami, jeśli jest więcej niż jeden równoległy plik do pobrania/stream.

Dlaczego ten flushBuffer() nie wysyła danych do klienta? Klient otrzyma wyskakujące okienko do otwierania/zapisywania pliku dopiero po zamknięciu odpowiedzi.

+0

Ponadto używam JOBSS 4,3 Sever do testowania tego kodu – Madhu

+0

czy gdzieś 'out.close()'? – Osw

+0

Tak, nie out.close(), ale nie wklejony tutaj – Madhu

Odpowiedz

3

Musisz ustawić nagłówek Content-Length przed zapisaniem danych lub serwer jest zmuszony do buforowania wszystkich danych do momentu zamknięcia strumienia, w którym to momencie może obliczyć samą wartość, napisać nagłówek i wysłać wszystkie dane. Jak najszybciej dostać się do strumienia wyjściowego, zanim napiszesz żadnych danych w ogóle ustawić długość treści:

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

Większość serwerów jest wystarczająco inteligentny, aby opróżnić bufora się w tym momencie, więc prawdopodobnie nawet nie musisz zadzwonić pod numer flushBuffer() - chociaż to nie boli.

+1

Zmęczyłem to. To się nie dzieje :-) – Madhu

+0

W zależności od twoich preferencji, możesz również zrobić 'response.setContentLength (blob.length());' – Stuporman

1

Przede wszystkim, trzeba mieć nagłówek odpowiedzi na odpowiedź servlet tak, że pojemnik może wiedzieć po ilu bajty mogą końca information:

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