2013-03-26 16 views
5

Sono in grado di trovare molte informazioni su come funziona Polling lungo (ad esempio, questo e questo), ma non semplici esempi di come implementarlo nel codice.codice sorgente longpolling di primavera?

In pratica, come utilizzerei Apache Tomcat per soddisfare le richieste e come scriverei una semplice app (molla) che "interrogava a lungo il server per i nuovi messaggi?

L'esempio non deve essere scalabile, sicuro o completo, deve solo funzionare! Apprezzerei se qualcuno potesse darmi un tale tutorial o fare riferimento a qualsiasi altro.

risposta

3

Ecco l'esempio più semplice che posso venire con ...

Nel controllore:

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

Nella visualizzazione chiamare questo, si farebbe di installazione una chiamata AJAX, e su un timeout semplicemente chiamalo di nuovo L'idea di un lungo polling è che il server non risponde fino a quando non ha qualcosa con cui rispondere.

Un approccio migliore, se si utilizza Spring 3.2, è quello di utilizzare DeferredResult o restituire un Callable dal metodo gestore. Se sei pre-Spring 3.2, ci sono diversi framework che puoi usare per aiutare, come Atmosphere, che funzionano bene con Spring. Alcuni hanno anche parti JavaScript per facilitare la codifica lato client.

+1

DeferredResult è un'aggiunta Spring 3.2 e consente di trasferire il DeferredResult creato a un processo separato. Callable è una classe Java, simile a Runnable. È più difficile implementare Callable in modo da consentire a un processo separato di gestire la risposta, sebbene non impossibile. Ecco un blog abbastanza decente su come ottenere il funzionamento di DeferredResult: http://blog.springsource.org/2012/05/13/spring-mvc-3-2-preview-adding-long-polling-to-an-existing -applicazione web/ – CodeChimp

0

Sulla base del anwser già esistente, un più efficiente variante "polling lungo" utilizzando il nuovo materiale che viene con Servlet 3 API (Tomcat 7) e Spring 3,2

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

Il punto è: il futuro è solo "un puntatore" (non capirlo letteralmente) per un risultato futuro. Quindi, il thread di spedizione per questa richiesta verrà sospeso/chiuso dopo aver gestito il codice sopra indipendentemente, indipendentemente dal futuro. QUANDO il futuro è risolto, la/una discussione verrà riattaccata e restituirà il risultato effettivamente (in questo caso una stringa). Ma pensa "Spring", questo potrebbe essere anche un POJO convertito in JSON.

Questo ha senso solo se il risultato futuro verrà risolto da un altro thread. In un'applicazione di chat, questo sarebbe un altro thread di richiesta con il nuovo messaggio (non consigliato) o un thread di dispatcher dedicato (meglio).