2009-11-13 21 views
17

Vogliamo inviare dati da un server ai client, ma è possibile utilizzare solo HTTP (porta 80). Qual è la migliore soluzione per la messaggistica? Un'idea è Comet. Ci sono altre idee o framework che offrono diciamo JMS su HTTP. (Sì, ActiveMQ supporta anche questo, ma WHO assomiglia e JXTA supporta anche questo, ma la configurazione è complicata.È preferibile qualcosa di semplice.)La soluzione migliore per Java HTTP push (messaggistica)

risposta

9

La soluzione più semplice per molti, molti motivi è usare un approccio basato su Comet (come Tu citi). Ciò significa che i client (a cui si desidera "spingere" i messaggi) aprono connessioni HTTP longevi. Quelle connessioni rimangono aperte fino a quando non scadono o si invia un messaggio al client. Non appena accade, il client apre una nuova connessione.

La connessione diretta ai client potrebbe essere problematica per molte ragioni: potrebbero essere dietro firewall che non consentono, potrebbero essere dietro a proxy e così via.

A meno che i client non siano server reali (nel qual caso sei davvero il cliente), chiedi loro di contattarti e invia una risposta a imitare push.

+0

È giusto? Quando il messaggio arriva al browser viene aperta una nuova connessione? – djna

+0

Il client deve essere programmato per aprire una nuova connessione. In caso contrario, il server non ha modo di comunicare con il client. – cletus

+1

Mi dispiace. Problemi nella comprensione. Il client ha aperto una connessione HTTP di lunga durata. Il server invia messaggi lassù - giusto? Quindi si dice "Quelle connessioni rimangono aperte fino a quando non scadono o si invia un messaggio al client. Non appena accade il client apre una nuova connessione". Sembra che stiamo aprendo una seconda connessione. Perché? Il messaggio che abbiamo appena ricevuto conteneva i dati che vogliamo, no? – djna

1

Abbiamo utilizzato COMET in combinazione con JMS utilizzando WAS Web 2.0 Feature Pack; in effetti il ​​server ha fatto il JMS iscriversi e COMET-ha spinto il messaggio al browser. come sviluppatore "sentiva" come se il browser si stesse iscrivendo a JMS. Questo "ha funzionato", quindi non abbiamo cercato ulteriori alternative.

Potrei immaginare un'implementazione JMS JavaScript pura nel browser, utilizzando HTTP come trasporto ma il mio istinto è che questo sarebbe molto pesante. Non conosco tali implementazioni.

1

L'approccio alternativo a quelli già discussi (cioè Comet ecc.) Consiste nell'implementare il polling nel client. Lo svantaggio di questo approccio è che si ha inevitabilmente un ritardo dal momento del messaggio/evento e fino a quando il cliente lo riceve. Se la tua applicazione è molto sensibile a tali ritardi, il polling è fuori.

Se una certa quantità di ritardo (almeno nell'ordine di pochi secondi) è accettabile, il polling è meno di un abuso del protocollo HTTP. È anche più robusto contro i problemi di rete temporanei come il server per i messaggi di coda predefiniti e non si arrabbia se il client non è disponibile nella sua pianificazione.

+0

Non c'è davvero alcuna grande differenza tra polling e connessioni a lunga durata. In entrambi i casi, si avvia un sondaggio, che ritorna immediatamente o con un certo ritardo. Più lungo è il ritardo, minori sono le connessioni che devi aprire. In tutti i casi problemi come le chiamate terminate o senza risposta sono solo portano al prossimo sondaggio. All'interno di HTTP/1.1 la connessione (TCP) rimane generalmente aperta. – eckes

7

Atmosphere e DWR sono entrambi framework open source che possono rendere Comet facile in Java.

Problemi correlati