2013-03-26 6 views
5

Я могу найти много информации о том, как работает Long Polling (например, это и это), но нет простых примеров того, как реализовать это в коде.весенний примерный пример кода?

В принципе, как я могу использовать Apache Tomcat для обслуживания запросов, и как бы я написал простое приложение (весна), которое «долгое время» опроса сервера для новых сообщений?

Пример не должен быть масштабируемым, безопасным или полным, он просто должен работать! Буду признателен, если кто-нибудь может дать мне такой учебник или обратиться к другому.

ответ

3

Вот самый простой пример, который я могу придумать ...

В контроллере:

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

В представлении вызова этого, вы могли бы установить вызов Ajax, а на тайм-аут просто вызовите это снова. Идея длительного опроса заключается в том, что сервер просто не отвечает, пока ему не на что ответить.

Лучшим подходом, если вы используете Spring 3.2, является использование DeferredResult или возврат вызываемого из вашего метода обработчика. Если вы до весны 3.2, то есть несколько рамок, которые вы можете использовать, чтобы помочь, например, Atmosphere, которые отлично работают с Spring. У некоторых даже есть части JavaScript, чтобы облегчить кодирование на стороне клиента.

+1

DeferredResult - дополнение Spring 3.2 и позволяет вам отделить созданный DeferredResult к отдельному процессу. Callable - это класс Java, аналогичный Runnable. Его сложнее реализовать Callable, чтобы позволить отдельному процессу обрабатывать ответ, хотя и не невозможно. Вот довольно приличный блог о том, как заставить DeferredResult работать: http://blog.springsource.org/2012/05/13/spring-mvc-3-2-preview-adding-long-polling-to-an-existing -веб приложение/ – CodeChimp

0

на основе уже существующего anwser, более эффективна «длинного опроса» вариант с использованием нового материала идет с Servlet 3 API (Tomcat 7) и весной 3,2

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

Дело: Будущее только «указатель» (не воспринимайте его буквально) к результату в будущем. Таким образом, поток отправки для этого запроса будет приостановлен/завершен после обработки кода выше, независимо от того, когда будущее будет разрешено. КОГДА будущее будет разрешено, поток/a будет повторно присоединен и вернет фактический результат (в данном случае строку). Но подумайте «Весна», это может быть также POJO, преобразованный в JSON.

Это имеет смысл только в том случае, если будущий результат будет разрешен другим потоком. В приложении чата это будет другой поток запросов с новым сообщением (не рекомендуется) или выделенным потоком диспетчера (лучше).