2012-05-11 44 views
6

Estoy tratando de implementar un servlet para la transmisión de objetos de gran tamaño:response.flushBuffer() no está funcionando

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

Este código suponer para enviar datos al cliente por trozo chunck. Ahora lo que sucede es que cuando reproduzco un objeto grande (100 MB), la memoria aumenta y el servidor muere a veces si hay más de una descarga/secuencia en paralelo.

¿Por qué este flushBuffer() no está enviando datos al cliente? El cliente obtiene una ventana emergente para abrir/guardar archivo solo después de que se cierra la respuesta.

+0

Además yo uso JOBSS 4.3 Sever para probar este código – Madhu

+0

¿en algún lugar 'out.close()'? – Osw

+0

sí lo hago out.close() pero no pegado aquí – Madhu

Respuesta

3

Debe configurar el encabezado Content-Length antes de escribir los datos, o el servidor está obligado a almacenar todos los datos hasta que se cierre la secuencia, momento en el que puede calcular el valor, escribir el encabezado y enviar todos los datos. Tan pronto como se obtiene la secuencia de salida, antes de escribir ningún dato en absoluto, establecer la longitud del contenido:

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

mayoría de los servidores son lo suficientemente inteligentes como para limpiar los propios tampón a este punto, por lo que probablemente ni siquiera necesita llamar al flushBuffer() - aunque no duele.

+1

Me cansé esto. No está pasando :-) – Madhu

+0

Dependiendo de su preferencia, también podría hacer 'response.setContentLength (blob.length());' – Stuporman

1

En primer lugar, se necesita una cabecera de respuesta para la respuesta servlet manera que el contenedor puede saber después de cuántos bytes puede finales información:

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