Application.scala 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package controllers
  2. import play.api.Play.current
  3. import play.api.mvc._
  4. import play.api.libs.json._
  5. import scala.concurrent.forkjoin.ThreadLocalRandom
  6. import scala.concurrent.{Future, ExecutionContext}
  7. import scala.collection.convert.WrapAsScala.collectionAsScalaIterable
  8. import play.modules.reactivemongo.ReactiveMongoPlugin
  9. import play.modules.reactivemongo.json.collection.JSONCollection
  10. import play.api.libs.concurrent.Execution.Implicits._
  11. import play.api.libs.concurrent.Akka
  12. object Application extends Controller {
  13. private val TestDatabaseRows = 10000
  14. val DEFAULT_HOST = "localhost:27017"
  15. val servers = current.configuration.getStringList("mongodb.servers") match {
  16. case Some(servers) => collectionAsScalaIterable(servers).toList
  17. case None => List(DEFAULT_HOST)
  18. }
  19. val DEFAULT_DB = "hello_world"
  20. val db = current.configuration.getString("mongodb.db").getOrElse(DEFAULT_DB)
  21. //private val dbExecutionContext: ExecutionContext = Akka.system.dispatchers.lookup("dbExecutionContext")
  22. private val database = ReactiveMongoPlugin
  23. .driver
  24. .connection(servers, nbChannelsPerNode = 10)
  25. .db(db)//(dbExecutionContext)
  26. private def collection: JSONCollection = database.collection[JSONCollection]("world")
  27. private val projection = Json.obj("_id" -> 0)
  28. def db(queries: Int) = Action.async {
  29. import scala.concurrent.ExecutionContext.Implicits.global
  30. val random = ThreadLocalRandom.current()
  31. val futureWorlds = Future.sequence((for {
  32. _ <- 1 to queries
  33. } yield { collection
  34. .find(Json.obj("id" -> (random.nextInt(TestDatabaseRows) + 1)), projection)
  35. .one[JsValue]
  36. }))
  37. futureWorlds.map { worlds =>
  38. Ok(Json.toJson(worlds))
  39. }
  40. }
  41. }