2012-07-05 9 views
6

Jak mogę strumienia wyjściowego tekstowy do strony w przeglądarce, aby pokazać postęp operacji, która może zająć około 15 - 20 sekund? Próbowałem wypisać bezpośrednio do strumienia wyjściowego HttpServletResponse, ale użytkownik nadal widzi pełną wydajność po cały proces został zakończony.Jak materiały tekstowe odpowiedź od wiosny MVC 3.0 Java webapp

To co próbowałem dotąd

@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

Czy próbowałeś spłukiwania OutputStream po każdym Chuck danych jest wysyłany? – Luciano

+0

@ Luciano Dodałem, co do tej pory próbowałem. To nie działa, gdy przeglądam stronę z Chrome – Danish

+0

Myślę, że twoim najlepszym rozwiązaniem byłoby inne podejście: użyj timera w javascriptu, który pobiera dane z/testu co 1 sekundę (lub pół sekundy), używając ajaxa i/test zwróci to, co nie zostało wysłane wcześniej, aż do momentu, w którym został wywołany. – Luciano

Odpowiedz

1

Nie jestem ekspertem od Spring MVC, ale wydaje mi się, że zrobiłbyś coś takiego, jak wysłanie 202 kodu odpowiedzi "accept", który oznacza, że ​​serwer otrzymał żądanie i wykona jakieś asynchroniczne przetwarzanie. Zazwyczaj serwer udostępnia adres URL, aby umożliwić klientowi wysyłanie żądań o statusie operacji. To, co próbujesz, narusza zwykły sposób działania relacji serwer/klient. Klient wywołuje serwer, a serwer odpowiada, a następnie połączenie zostaje zamknięte. W jakim kontekście próbujesz to zrobić i z jakiego powodu? Być może mógłbym zaoferować więcej wglądu lub wymyślić inny sposób, aby to zrobić?

+2

Dzięki za zainteresowanie! Zasadniczo chcę zapewnić użytkownikowi możliwość zażądania wykonania pracy, być w stanie monitorować postępy i mieć jego widok zaktualizowany po zakończeniu pracy. Widzę, jak można to zrobić, wykonując asynchronizator zadań i utrzymując stan w "sesji" i ankietę z interfejsu użytkownika. * Jednak * jeśli moje pytanie ma poprawną odpowiedź, widzę, że robi się to bez asynchronicznego executora i zarządzania państwem. – Danish

+0

Czuję, że to, o co prosisz, polega na tym, że serwer kontaktuje się z klientem, i choć nie jest to niemożliwe, będzie to wysoce nieregularne. Oczywiście istnieją trasy do wysyłania informacji z powrotem do klienta (np. FTP) w porcjach, ale niestety wiem, czy to ma zastosowanie do tego, co chcesz zrobić, ani nie wiem, czy jest to możliwe z Spring MVC. Powodzenia! – thatidiotguy

+0

Dzięki! Prawdopodobnie skorzystam z metody głosowania, o której wspominaliście i na razie, i na razie pozostawiacie to pytanie otwarte.Po prostu uwielbiam odkrywać wszystkie możliwości. Twoje zdrowie! – Danish

-4
@Controller 
public class MyController{ 

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

Jeśli używasz kontrolera sprężyny można zrobić wyżej z dopiskiem ciała odpowiedzi.

+1

Jak to rozwiązuje problem częściowego postępu? –

+0

@SeanPatrickFloyd oh, nie widziałem/czytałem tego fragmentu. To trochę trudniejsze ... nie jestem pewien – NimChimpsky

1

spróbować użyć:

response.flushBuffer(); 

jak JavaDoc mówi:

Siły wszelkie treści w buforze być napisane do klienta. Wywołanie tej metody automatycznie zatwierdza odpowiedź, co oznacza, że ​​kod statusu i nagłówki zostaną zapisane.

Powiązane problemy