2013-03-26 15 views
5

Mogę znaleźć wiele informacji na temat tego, jak działa Long Polling (na przykład to i to), ale nie ma prostych przykładów tego, jak zaimplementować to w kodzie.przykładowy kod z długim łańcuchem?

Zasadniczo, w jaki sposób mogę użyć serwera Apache Tomcat do obsługi żądań i jak mam napisać prostą aplikację (wiosna), która "odwiedzi" serwer w poszukiwaniu nowych wiadomości?

Przykład nie musi być skalowalny, bezpieczny ani kompletny, po prostu musi działać! Byłbym wdzięczny, gdyby ktoś mógł dać mi taki samouczek lub polecić inny.

Odpowiedz

3

Oto najprostszy przykład mogę wymyślić ...

W regulatorze:

@RequestMapping("/longPolling") 
public String longPolling(Model model) { 
    while(true) { 
    // .. Do something, break when done... 
    if(somethingIsDone) { 
     break; 
    } 
    } 
    return "someResponse"; 
} 

w widoku nazywając to, byś konfiguracja wywołanie ajax i po prostu na timeout zadzwoń jeszcze raz. Pomysł długiego sondowania polega na tym, że serwer po prostu nie odpowiada, dopóki nie ma na co odpowiedzieć.

Lepszym podejściem, jeśli używasz Spring 3.2, jest użycie DeferredResult lub zwrócenie metody Callable z metody obsługi. Jeśli jesteś w wersji przed wiosną 3.2, możesz skorzystać z wielu frameworków, które pomogą Ci, na przykład w Atmosferze, pracować dobrze z wiosną. Niektóre mają nawet części JavaScript, aby ułatwić kodowanie po stronie klienta.

+1

DeferredResult jest dodatkiem Spring 3.2 i umożliwia przekazanie utworzonego DeferredResult do osobnego procesu. Callable to klasa Java, podobna do Runnable. Trudniej jest wdrożyć program Callable w taki sposób, aby umożliwić oddzielny proces obsługi odpowiedzi, choć nie jest to niemożliwe. Oto dość przyzwoity blog na temat tego, jak sprawić, aby DeferredResult działał: http://blog.springsource.org/2012/05/13/spring-mvc-3-2-preview-adding-long-polling- to-an- existing -Aplikacja internetowa/ – CodeChimp

0

oparciu o już istniejącą anwser, bardziej sprawna „long polling” wariant z wykorzystaniem nowych rzeczy pochodzących z Servlet 3 API (Tomcat 7) i sprężynę 3,2

@RequestMapping("/longPolling") 
public Future<String> longPolling(Model model) { 
    return callSomethingWhereAFutureReturns(); 
} 

Chodzi o to: przyszłość jest tylko "wskaźnik" (nie rozumiem tego dosłownie) do wyniku w przyszłości. W związku z tym wątek wysyłania dla tego żądania zostanie zawieszony/zakończony po użyciu powyższego kodu, niezależnie od tego, kiedy zostanie rozwiązana przyszłość. KIEDY przyszłość zostanie rozwiązana, wątek/zostanie ponownie przyłączony i zwróci rzeczywisty wynik (w tym przypadku ciąg). Ale pomyśl "Wiosna", może to być POJO przekonwertowane na JSON.

Ma to sens tylko wtedy, gdy przyszły wynik zostanie rozwiązany przez inny wątek. W aplikacji do czatu byłby to kolejny wątek z nową wiadomością (niezalecany) lub dedykowanym wątkiem dyspozytora (lepiej).

Powiązane problemy