2012-07-05 9 views
6

Come è possibile eseguire il flusso di output del testo sulla pagina del browser per mostrare l'avanzamento di un'operazione che potrebbe richiedere circa 15 - 20 secondi? Ho provato a scrivere direttamente nel flusso di output di HttpServletResponse, ma l'utente continua a vedere l'intero output dopo il l'intero processo è terminato.Come eseguire il flusso di risposta del testo da un'applicazione Web Java Spring MVC 3.0

questo è quello che ho provato finora

@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

Avete provato a svuotare il flusso di uscita dopo ogni chuck di dati viene inviato? – Luciano

+0

@ Luciano Ho aggiunto quello che ho provato fino ad ora alla domanda. Questo non funziona quando visualizzo la pagina da Chrome – Danish

+0

Penso che la tua migliore scommessa sarebbe un approccio diverso: usa un timer in javascript che preleva dati da/test ogni 1 secondo (o mezzo secondo), usando ajax, e/il test restituiva ciò che non è stato inviato prima che venisse chiamato. – Luciano

risposta

1

Non sono un esperto di Spring MVC, ma penso che si farebbe qualcosa come inviare un codice di risposta 202 di "accettato", che indica che il server ha ricevuto la richiesta e sta per eseguire un'elaborazione asincrona. Di solito, il server fornisce un URL per consentire al client di emettere richieste sullo stato dell'operazione. Quello che stai cercando di fare viola il solito modo in cui le relazioni server/client funzionano. Il client chiama il server e il server risponde e quindi la connessione viene chiusa. In che contesto stai cercando di fare questo e per quale motivo? Forse potrei offrire qualche idea in più o pensare ad un altro modo per farlo?

+2

Grazie per l'interesse! Fondamentalmente, voglio fornire all'utente la possibilità di richiedere l'esecuzione di un lavoro, essere in grado di monitorare i progressi e avere la sua vista aggiornata al termine del lavoro. Posso vedere come questo può essere fatto rendendo il job executor asincrono e mantenendo uno stato nella 'sessione' e il sondaggio dall'interfaccia utente. * Tuttavia * se la mia domanda ha una risposta valida, posso vedere che questo viene fatto senza un esecutore asincrono e la gestione dello stato. – Danish

+0

Mi sembra che quello che stai chiedendo è che il server contatti il ​​cliente e, sebbene non sia impossibile, sarebbe molto irregolare. Ovviamente ci sono percorsi per inviare informazioni al client (come FTP) in quantità chunked, ma sfortunatamente, so se questo è applicabile per ciò che si vuole fare, né so se è possibile con Spring MVC. In bocca al lupo! – thatidiotguy

+0

Grazie! Probabilmente andrò con il metodo di votazione che tu e altri avete già menzionato per ora e tenga aperta questa domanda per il momento.Adoro esplorare tutte le possibilità. Saluti! – Danish

-4
@Controller 
public class MyController{ 

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

Se si sta utilizzando controller di primavera che si possa fare quanto sopra con il corpo della risposta annotazione.

+1

Come si risolve il problema dell'output parziale del progresso? –

+0

@SeanPatrickFloyd oh giusto, non ho visto/letto quel pezzo. Questo è un po 'più difficile ... non sicuro – NimChimpsky

1

tenta di utilizzare:

response.flushBuffer(); 

come JavaDoc dice:

Forze qualsiasi contenuto nel buffer da scrivere al cliente. Una chiamata a questo metodo impegna automaticamente la risposta, il che significa che il codice di stato e le intestazioni saranno scritte.

Problemi correlati