Tailable Cursors through WebSockets with ReactiveMongo and Play 2.0
Scala HTML
Latest commit ab26108 Jun 29, 2015 @sgodbillon Merge pull request #5 from cchantep/0.11.0.play24
Update to 0.11.0.play24
Permalink
Failed to load latest commit information.
app Update to 0.11.0.play24 Jun 28, 2015
conf Update to 0.11.0.play24 Jun 28, 2015
project Update to 0.11.0.play24 Jun 28, 2015
public init Jun 16, 2012
.gitignore init Jun 16, 2012
NOTICE.txt Notice and source formatting Jul 20, 2012
README.md Update README.md May 7, 2013
build.sbt Update to 0.11.0.play24 Jun 28, 2015

README.md

Tailable Cursors through WebSockets with ReactiveMongo and Play 2

ReactiveMongo allows to enumerate a MongoDB cursor in a non-blocking and asynchronous way.

This demo shows how to stream the documents that are inserted into a capped collection through a WebSocket, using the ReactiveMongo Play Plugin. It demonstrates the following features:

  • Tailable Cursors with ReactiveMongo
  • Creating capped collections
  • Cursor Enumerators
  • Non-blocking I/O
  • Integration with Play JSON library (included in the Play ReactiveMongo Plugin)
  • Integration of ReactiveMongo with Play 2 WebSocket API.

When run, this sample allows to submit new documents via a WebSocket and inserts them into the Capped Collection. This Capped Collection is enumerated through the same Websocket, so any new document is eventually sent back to the client.

def watchCollection = WebSocket.using[JsValue] { request =>
  val collection = db.collection[JSONCollection]("acappedcollection")
  // Inserts the received messages into the capped collection
  val in = Iteratee.flatten(futureCollection.map(collection => Iteratee.foreach[JsValue] { json =>
    println("received " + json)
    collection.insert(json)
  }))

  // Enumerates the capped collection
  val out = {
    val futureEnumerator = futureCollection.map { collection =>
      // so we are sure that the collection exists and is a capped one
      val cursor: Cursor[JsValue] = collection
        // we want all the documents
        .find(Json.obj())
        // the cursor must be tailable and await data
        .options(QueryOpts().tailable.awaitData)
        .cursor[JsValue]

      // ok, let's enumerate it
      cursor.enumerate
    }
    Enumerator.flatten(futureEnumerator)
  }

  // We're done!
  (in, out)
}

Get the complete example and run it! It uses Play 2.1, ReactiveMongo master and Play ReactiveMongo Plugin.