2012-07-05 9 views
6

¿Cómo puedo transmitir la salida de texto a la página en el navegador para mostrar el progreso de una operación que puede tomar entre 15 y 20 segundos? He intentado escribir directamente en la secuencia de salida de HttpServletResponse, pero el usuario sigue viendo la salida completa después de que haya finalizado todo el proceso.Cómo transmitir la respuesta de texto desde una aplicación de Java Spring MVC 3.0

Esto es lo que he probado hasta ahora

@RequestMapping(value = "/test") 
public void test(HttpServletResponse response) 
      throws IOException, InterruptedException { 
    response.getOutputStream().println("Hello"); 
    response.getOutputStream().flush(); 
    Thread.sleep(2000); 
    response.getOutputStream().println("How"); 
    response.getOutputStream().flush(); 
    Thread.sleep(2000); 
    response.getOutputStream().println("are"); 
    response.getOutputStream().flush(); 
    Thread.sleep(2000); 
    response.getOutputStream().println("you"); 
    response.getOutputStream().flush(); 
} 
+0

¿Ha probado lavar la salida de salida después de enviar cada plato de datos? – Luciano

+0

@Luciano He agregado lo que he intentado hasta ahora a la pregunta. Esto no funciona cuando veo la página de Chrome – Danish

+0

Creo que la mejor opción sería un enfoque diferente: use un temporizador en javascript que busque datos de/prueba cada 1 segundo (o medio segundo), usando ajax, y/la prueba devolvería lo que no se haya enviado antes hasta el momento en que se llamó. – Luciano

Respuesta

1

No soy experto en Spring MVC, pero creo que harías algo así como enviar un código de respuesta 202 de "aceptado", lo que indica que el servidor ha recibido la solicitud y va a hacer un procesamiento asincrónico. Por lo general, el servidor proporciona una URL para permitir que el cliente emita solicitudes sobre el estado de la operación. Lo que intenta hacer viola la forma habitual en que funcionan las relaciones servidor/cliente. El cliente llama al servidor y el servidor responde y luego se cierra la conexión. ¿En qué contexto estás tratando de hacer esto y por qué razón? ¿Quizás podría ofrecer algo más de información o pensar en otra forma de hacerlo?

+2

¡Gracias por su interés! Básicamente, quiero brindar al usuario la capacidad de solicitar una ejecución de trabajo, poder monitorear el progreso y tener su vista actualizada una vez que el trabajo finaliza. Puedo ver cómo se puede hacer esto al hacer que el ejecutor de trabajos asincronice y mantenga algún estado en la 'sesión 'y encuesta desde la interfaz de usuario. * Sin embargo * si mi pregunta tiene una respuesta válida, puedo ver que esto se hace sin un ejecutor asincrónico y administración estatal. – Danish

+0

Creo que lo que está pidiendo es que el servidor se ponga en contacto con el cliente y, aunque no imposible, sería muy irregular. Obviamente, hay rutas para enviar información al cliente (como FTP) en cantidades fragmentadas, pero desafortunadamente, sí sé si eso es aplicable para lo que quiere hacer, ni sé si es posible con Spring MVC. ¡Buena suerte! – thatidiotguy

+0

¡Gracias! Probablemente vaya con el método de votación que usted y otros han mencionado por el momento y mantenga esta pregunta abierta por el momento.Me encanta explorar todas las posibilidades. ¡Aclamaciones! – Danish

-4
@Controller 
public class MyController{ 

    @RequestMapping(value = "/test", method = RequestMethod.GET) 
    public @ResponseBody String getTest() { 
     return "hello how are you"; 
    } 
} 

Si está utilizando el controlador de primavera que podría hacer lo anterior con la anotación cuerpo de la respuesta.

+1

¿Cómo resuelve eso el problema de la salida de progreso parcial? –

+0

@SeanPatrickFloyd oh, no he visto/leído ese bit. Eso es un poco más difícil ... no estoy seguro – NimChimpsky

1

tratan de utilizar:

response.flushBuffer(); 

como JavaDoc dice:

Fuerzas cualquier contenido en el búfer que se escribirá en el cliente. Una llamada a este método confirma automáticamente la respuesta, lo que significa que se escribirá el código de estado y los encabezados.

Cuestiones relacionadas