Browse Source

Made the db requesting asynchronous

Christopher Hunt 12 years ago
parent
commit
ac871c125e
1 changed files with 27 additions and 12 deletions
  1. 27 12
      play-java/app/controllers/Application.java

+ 27 - 12
play-java/app/controllers/Application.java

@@ -1,27 +1,32 @@
 package controllers;
 
+import models.World;
+import play.libs.F;
 import play.libs.Json;
-import play.mvc.*;
 import static play.libs.Akka.future;
-import java.util.concurrent.Callable;
 import org.codehaus.jackson.node.ObjectNode;
 import org.codehaus.jackson.map.ObjectMapper;
-import views.html.*;
-import models.*;
-import java.util.*;
-import java.util.concurrent.*;
+import play.mvc.Controller;
+import play.mvc.Result;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ThreadLocalRandom;
 
 public class Application extends Controller {
 
     private static final int TEST_DATABASE_ROWS = 10000;
     //http://stackoverflow.com/questions/3907929/should-i-make-jacksons-objectmapper-as-static-final
-    private static ObjectMapper objectMapper = new ObjectMapper();
+    private static final ObjectMapper objectMapper = new ObjectMapper();
 
     public static Result json() {
         return async(
           future(new Callable<Result>() {
+              @Override
               public Result call() {
-                  ObjectNode result = objectMapper.createObjectNode();
+                  final ObjectNode result = objectMapper.createObjectNode();
                   result.put("message", "Hello World!");
                   return ok(result);
               }
@@ -32,15 +37,25 @@ public class Application extends Controller {
     public static Result db(final Integer queries) {
         return async(
           future(new Callable<Result>() {
+              @Override
               public Result call() {
                   final Random random = ThreadLocalRandom.current();
-                  final World[] worlds = new World[queries];
-
-                  for (int i = 0; i < queries; i++) {
-                      worlds[i] = World.find.byId((long)(random.nextInt(TEST_DATABASE_ROWS) + 1));
+                  final List<F.Promise<? extends World>> promises = new ArrayList<F.Promise<? extends World>>(queries);
+                  for (int i = 0; i < queries; ++i) {
+                      promises.add(future(findWorld(Long.valueOf(random.nextInt(TEST_DATABASE_ROWS) + 1))));
                   }
+                  final List<World> worlds = F.Promise.sequence(promises).get();
                   return ok(Json.toJson(worlds));
               }
+
+              private Callable<World> findWorld(final Long id) {
+                  return new Callable<World>() {
+                      @Override
+                      public World call() {
+                          return World.find.byId(id);
+                      }
+                  };
+              }
           })
         );