2013-06-03 11 views
7

È possibile lasciare che il server invii messaggi a tutti i client connessi senza attendere l'intervento da parte loro? Lasciatemi spiegare :-) Ho letto lo docs/examples e non ho trovato nulla che soddisfi le mie esigenze: il flusso è sempre lo stesso; un client si connette (ad esempio una chiamata GET a un'API Rest), la connessione è sospesa e fino a quando non viene ricevuta una nuova chiamata API (ad es. una chiamata POST) il server semplicemente attende (o almeno questo è ciò che ho capito). Il mio caso d'uso è piuttosto diverso: voglio che il server invii alcune "notifiche" non appena i nuovi dati saranno disponibili. Questo sarebbe il mio caso d'uso (abbastanza simplifed):Atmosfera Jersey - Messaggi server

  1. client A si connette al server
  2. connessione è sospesa dal momento che nessun nuovo dato è disponibile al momento
  3. Il server viene notificato sono disponibili nuovi dati da un esterna sorgente e lo trasmette al client a
  4. Passare al punto 2

Quello che ho realizzato finora è sempre la connessione stabilita con successo. Il prossimo passo è risolvere questo problema del server. Devo dire che questa tecnologia è completamente nuova per me, quindi è possibile che abbia frainteso il modo in cui qualcosa funziona. Se è così, fammi sapere!

Questo è il mio stack:

  • Primavera 3.2.0 STAMPA
  • Jersey 1,8
  • Atmosfera Jersey 1.0.13
  • Tomcat 7.0.40

Grazie a tutti in avanzare!

UPDATE: Dopo aver seguito this ottengo questo avvertimento, che non ho idea di come sbarazzarsi di:

2013-06-04 09:40:36,284 WARN [org.atmosphere.cpr.AtmosphereFramework] - Failed using comet support: org.atmosphere.container.Tomcat7AsyncSupportWithWebSocket, error: Tomcat failed to detect this is a Comet application because context.xml is missing or the Http11NioProtocol Connector is not enabled. 
If that's not the case, you can also remove META-INF/context.xml and WEB-INF/lib/atmosphere-compat-tomcat.jar Is the Nio or Apr Connector enabled? 
2013-06-04 09:40:36,285 WARN [org.atmosphere.cpr.AtmosphereFramework] - Using org.atmosphere.container.Tomcat7BIOSupportWithWebSocket 

Ho seguito la struttura di applicazione commentato here, quindi questo non dovrebbe essere un problema. Ho notato che cambiando il trasporto in "websocket" invece di "long-polling" non si mostrano errori. Il server invia infine dati difficili :)

risposta

0

Ho seguito il tuo link e ho modificato leggermente il codice.

Quando si è nella fase 3 "viene notificato il server sono disponibili nuovi dati da una fonte esterna e trasmette al cliente A", si deve scrivere una linea come questa:

BroadcasterFactory.getDefault().lookup("/*").broadcast(response); 

All'inizio ho usato il TextMessage ricevuto dalla mia coda ActiveMQ ma ho ricevuto questo errore, quindi ho usato una classe Jackson come risposta all'oggetto e tutto ha funzionato bene.

GRAVE: Uno scrittore corpo del messaggio per Java di classe org.apache.activemq.command.ActiveMQTextMessage, e il tipo di classe Java org.apache.activemq.command.ActiveMQTextMessage, e MIME tipo di media application/json non è stato trovato giu 03, 2014 11:32:21 com.sun.jersey.spi.container.ContainerResponse scrivere gravi: Gli scrittori corpo del messaggio registrato compatibili con il tipo di supporto MIME sono: application/json (JSONJAXBElementProvider, JSONArrayProvider, JSONObjectProvider, JSONRootElementProvider, JSONListElementProvider, ...)