Frage

Gibt es eine Möglichkeit zu „subscribe“ von GWT zu JSON-Stream-Objekten und hört auf eingehende Ereignisse auf Keep-Alive-Verbindung, ohne zu versuchen, sie alle auf einmal zu holen? Ich glaube, dass das Schlagwort-du-jour für diese Technologie ist „Comet“.

Nehmen wir an, dass ich HTTP-Dienst haben, die Verbindung keep-alive öffnet und setzen JSON-Objekte mit eingehenden Aktienkurse dort in Echtzeit:

{"symbol": "AAPL", "bid": "88.84", "ask":"88.86"}
{"symbol": "AAPL", "bid": "88.85", "ask":"88.87"}
{"symbol": "IBM", "bid": "87.48", "ask":"87.49"}
{"symbol": "GOOG", "bid": "305.64", "ask":"305.67"}
...

muss ich diese Ereignisse hören und aktualisieren GWT Komponenten (Tabellen, Etiketten) in Echtzeit. Irgendwelche Ideen, wie es zu tun?

War es hilfreich?

Lösung

Es gibt eine GWT Comet-Modul für StreamHub:

http://code.google.com/p/gwt-comet-streamhub /

StreamHub ist ein Comet-Server mit einer freien Community Edition. Es ist ein Beispiel davon in Aktion .

Sie werden den StreamHub Comet-Server herunterladen müssen und einen neuen SubscriptionListener zu schaffen, das StockDemo Beispiel als Ausgangspunkt verwenden, dann eine neue JsonPayload erstellen, die Daten streamen:

Payload payload = new JsonPayload("AAPL");
payload.addField("bid", "88.84");
payload.addField("ask", "88.86");
server.publish("AAPL", payload);
...

Laden Sie die JAR aus dem Code-Website Google, fügen Sie es Ihrem Classpath GWT-Projekte, und fügen Sie Ihre GWT-Modul die folgenden:

<inherits name="com.google.gwt.json.JSON" />
<inherits name="com.streamhub.StreamHubGWTAdapter" />

Verbinden und abonnieren von Ihrem GWT-Code:

StreamHubGWTAdapter streamhub = new StreamHubGWTAdapter();
streamhub.connect("http://localhost:7979/");
StreamHubGWTUpdateListener listener = new StockListener();
streamhub.subscribe("AAPL", listener);
streamhub.subscribe("IBM", listener);
streamhub.subscribe("GOOG", listener);
...

Dann bearbeiten Sie das Updates, wie Sie in dem Update-Hörer mögen (auch im GWT-Code):

public class StockListener implements StreamHubGWTUpdateListener {
      public void onUpdate(String topic, JSONObject update) {
          String bid = ((JSONString)update.get("bid")).stringValue();
          String ask = ((JSONString)update.get("ask")).stringValue();
          String symbol = topic;
          ...
      }
}

Vergessen Sie nicht streamhub-min.js in Ihren GWT Projekten Haupt-HTML-Seite.

enthalten

Andere Tipps

Ich habe diese Technik in einigen Projekten eingesetzt, obwohl es sie Probleme hat. Ich sollte anmerken, dass ich nur diese speziell durch GWT-RPC getan haben, aber das Prinzip ist das gleiche für was auch immer Mechanismus Sie verwenden Daten zu verarbeiten. Je nachdem, was genau tun Sie, könnte es nicht viel nötig sein, über die Dinge komplizieren.

Zunächst einmal, auf der Client-Seite, glaube ich nicht, dass GWT richtig, jede Art von Streaming-Daten unterstützen kann. Die Verbindung muss schließen, bevor der Kunde tatsächlich die Daten verarbeiten kann. Was dies bedeutet, von einem Server-Push-Standpunkt ist, dass Ihr Client mit dem Server verbinden und blockieren, bis die Daten, an denen zur Verfügung Punkt es zurück. Was auch immer Code ausgeführt wird auf die fertige Verbindung sofort wieder zu öffnen, eine neue Verbindung mit dem Server, um weitere Daten zu warten.

Von der Server-Seite der Dinge, Sie einfach in einen Wartezyklus fallen (die Java gleichzeitige Paket ist besonders praktisch für diese mit Blöcken und Timeouts), bis neue Daten verfügbar sind. Zu diesem Zeitpunkt kann der Server ein Paket von Daten zurück bis auf den Client, entsprechend aktualisieren. Es gibt eine Reihe von Überlegungen, je nachdem, was Ihre Datenfluss ist wie, aber hier sind ein paar zu denken:

  • Ist immer ein Client jedes einzelne Update wichtig? Wenn ja, dann muss der Server alle möglichen Ereignisse zwischen dem Zeitpunkt, cachen der Client einige Daten bekommt und dann wieder verbindet.
  • Wird es Gobs über Aktuelles sein? Wenn dies der Fall ist, könnte es klüger sein, eine Reihe von Aktualisierungen zu verpacken und Stücke eher alle paar Sekunden auf eine Zeit nach unten drücken, als wenn der Kunde zu einem Zeitpunkt ein Update erhalten.
  • Der Server muss wahrscheinlich eine Möglichkeit erkennen, ob ein Kunde weg riesige Mengen von im Cache gespeicherten Pakete für diesen Client zu vermeiden gegangen ist häufen sich.

Ich fand es mit dem Server-Push-Ansatz zwei Probleme. Mit vielen Kunden bedeutet dies viele offene Verbindungen auf dem Webserver. Je nach dem Web-Server in Frage, könnte dies bedeuten, viele Themen offen angelegt und gehalten werden. Die zweite hat mit dem typischen Browser-Grenze von 2 Anfragen pro Domain zu tun. Wenn Sie in der Lage sind Ihre Bilder, CSS und andere statische Inhalte fro Second Level Domains zu dienen, kann dieses Problem gemildert werden.

Es ist in der Tat eine cometd artige Bibliothek für GWT - http://code.google.com / p / gwteventservice /

Aber ich habe persönlich nicht verwenden es, so kann nicht wirklich für bürgen, ob sie gut oder nicht, aber die doco scheint recht gut. einen Versuch wert.

Theres ein paar andere, die ich gesehen habe, wie GWT-Rakete cometd Bibliothek.

Einige vorläufige Ideen für Comet-Implementierung für GWT können hier ... obwohl ich frage mich, ob es etwas reiferen ist.

Auch einige Einblicke in GWT / Comet Integration ist verfügbar es , mit selbst mehr Schneid-and-bleeding edge Technologie: "Landungssteg Fortsetzungen". Lohnt sich, einen Blick.

Hier Sie eine Beschreibung finden (mit einigen Quelle Proben), wie dies für IBM WebSphere Application Server zu tun. Sollte nicht zu unterschiedlich sein mit Jetty oder anderem Comet-fähigen J2EE-Server. Kurz gesagt, ist die Idee: JSON-String über GWT RPC Ihr Java-Objekt kodieren, dann mit cometd es an den Client gesendet, wo sie von Dojo, das löst Ihre JSNI Code, der ruft Ihr Widget Methoden empfangen wird, in dem Sie das Objekt deserialisieren Verwendung wieder GWT RPC. Voila! :)

Meine Erfahrung mit dieser Einstellung positiv ist, gibt es keine Probleme mit Ausnahme der Sicherheitsfragen mit ihm waren. Es ist nicht wirklich klar, wie die Sicherheit in diesem Fall für Kometen zu implementieren ... Es scheint, dass Comet Update Servlets verschiedene URLs haben sollte und dann kann die J2EE-Sicherheit angewandt werden.

Das JBoss Errai Projekt hat eine Nachricht Bus, der eine bidirektionale Nachrichtenbereitstellt, die eine gute Alternative bietet cometd.

Wir sind mit Atmosphere Framewrok ( http://async-io.org/ ) für Serverpush / Comet in GWT aplication.

Auf einem Client-Seite-Framework hat GWT-Integration, die ziemlich einfach ist. Auf einer Server-Seite verwendet es schlicht Servlets.

Wir sind derzeit in der Produktion mit 1000 concurent Benutzer in Clusterumgebung. Wir hatten einige Probleme auf dem Weg, der durch Modifizieren Atmosphäre Quelle gelöst werden mussten. Auch die Dokumentation ist wirklich dünn.

Framework ist kostenlos zu benutzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top