Search code examples
jsongwtcomet

GWT / Comet: any experience?


Is there any way to "subscribe" from GWT to JSON objects stream and listen to incoming events on keep-alive connection, without trying to fetch them all at once? I believe that the buzzword-du-jour for this technology is "Comet".

Let's assume that I have HTTP service which opens keep-alive connection and put JSON objects with incoming stock quotes there in real time:

{"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"}
...

I need to listen to this events and update GWT components (tables, labels) in realtime. Any ideas how to do it?


Solution

  • There is a GWT Comet Module for StreamHub:

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

    StreamHub is a Comet server with a free community edition. There is an example of it in action here.

    You'll need to download the StreamHub Comet server and create a new SubscriptionListener, use the StockDemo example as a starting point, then create a new JsonPayload to stream the data:

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

    Download the JAR from the google code site, add it to your GWT projects classpath and add the include to your GWT module:

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

    Connect and subscribe from your 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);
    ...
    

    Then process the updates how you like in the update listener (also in the 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;
              ...
          }
    }
    

    Don't forget to include streamhub-min.js in your GWT projects main HTML page.