2013-06-03 3 views
7

Ist es möglich, den Server Nachrichten an alle verbundenen Clients senden zu lassen, ohne auf irgendeine Aktion von ihnen warten zu müssen? Lassen Sie es mich erklären :-) Ich habe die docs/examples gelesen und ich habe nichts gefunden, das meine Bedürfnisse erfüllt: der Fluss ist immer der gleiche; Ein Client verbindet (z. B. einen GET-Aufruf mit einer Rest-API), die Verbindung wird unterbrochen und bis ein neuer API-Aufruf empfangen wird (z. B. ein POST-Aufruf) wartet der Server einfach (oder zumindest habe ich das verstanden). Mein Anwendungsfall ist ziemlich anders: Ich möchte, dass der Server einige "Benachrichtigungen" sendet, sobald neue Daten verfügbar sind. Das wäre mein Anwendungsfall (ziemlich simplifed) sein:Atmosphere Jersey - Server Nachrichten

  1. Client A eine Verbindung zum Server
  2. Verbindung, da keine neuen Daten zur Zeit verfügbar ausgesetzt ist
  3. Der Server neue Daten informiert wird, ist von einer externe Quelle und sendet es ein
  4. zum Client Schritt 2

Was ich bisher erreicht haben, wird die Verbindung erfolgreich aufgebaut zu bekommen. Der nächste Schritt besteht darin, dieses Serverproblem zu lösen. Ich muss sagen, dass diese Technologie für mich völlig neu ist, daher ist es möglich, dass ich missverstanden habe, wie etwas funktioniert. Wenn das der Fall ist, lass es mich wissen!

Das ist mein Stack:

  • Frühling 3.2.0 RELEASE
  • Jersey 1.8
  • Atmosphäre Jersey 1.0.13
  • Tomcat 7.0.40

Danke alle in voraus!

UPDATE: Nach this folgenden bekomme ich diese Warnung, die ich keine Ahnung, wie man loswerden:

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 

Ich folgte die Struktur App here kommentiert, so sollte dies kein Problem sein. Ich habe festgestellt, dass durch die Umstellung auf "Websocket" anstelle von "Long-Polling" keine Fehler angezeigt werden. Der Server sendet endlich Daten hart :)

Antwort

0

Ich folgte Ihrem Link und änderte den Code ein wenig.

Wenn Sie in Schritt 3 sind „Der Server wird benachrichtigt neue Daten von einer externen Quelle verfügbar ist und sendet es an den Client A“, müssen Sie eine Zeile wie diese schreiben:

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

Zuerst benutzte ich die TextMessage, die ich von meiner ActiveMQ-Queue erhielt, aber ich erhalte diesen Fehler, also habe ich eine Jackson-Klasse als Objektantwort verwendet und alles hat gut funktioniert.

SCHWERE: Ein Nachrichtentext Autor für Java-Klasse org.apache.activemq.command.ActiveMQTextMessage und Java-Typklasse org.apache.activemq.command.ActiveMQTextMessage und MIME-Medientyp application/json nicht gefunden wurde jun 03, 2014 11:32:21 com.sun.jersey.spi.container.ContainerResponse schreiben SCHWEREN: Die registrierten Nachrichtentext Autoren kompatibel mit dem MIME-Medientypen sind: application/json (JSONJAXBElementProvider, JSONArrayProvider, JSONObjectProvider, JSONRootElementProvider, JSONListElementProvider, ...)