WebServer.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import org.vertx.java.core.Handler;
  2. import org.vertx.java.core.buffer.Buffer;
  3. import org.vertx.java.core.eventbus.Message;
  4. import org.vertx.java.core.http.HttpServerRequest;
  5. import org.vertx.java.core.http.HttpServerResponse;
  6. import org.vertx.java.core.json.JsonArray;
  7. import org.vertx.java.core.json.JsonObject;
  8. import org.vertx.java.core.json.impl.Json;
  9. import org.vertx.java.platform.Verticle;
  10. import java.text.DateFormat;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Collections;
  13. import java.util.Date;
  14. import java.util.Random;
  15. import java.util.concurrent.ThreadLocalRandom;
  16. public class WebServer extends Verticle implements Handler<HttpServerRequest> {
  17. private Buffer helloWorldBuffer = new Buffer("Hello, World!");
  18. private String helloWorldContentLength = String.valueOf(helloWorldBuffer.length());
  19. private DateFormat DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyyy HH:mm:ss z");
  20. private String dateString;
  21. @Override
  22. public void start() {
  23. vertx.createHttpServer().requestHandler(WebServer.this).listen(8080);
  24. vertx.setPeriodic(1000, new Handler<Long>() {
  25. @Override
  26. public void handle(Long timerID) {
  27. formatDate();
  28. }
  29. });
  30. formatDate();
  31. }
  32. @Override
  33. public void handle(HttpServerRequest req) {
  34. String path = req.path();
  35. switch (path) {
  36. case "/plaintext":
  37. handlePlainText(req);
  38. break;
  39. case "/json":
  40. handleJson(req);
  41. break;
  42. case "/db":
  43. handleDbMongo(req);
  44. break;
  45. case "/queries":
  46. handleQueriesMongo(req);
  47. break;
  48. default:
  49. req.response().setStatusCode(404);
  50. req.response().end();
  51. }
  52. }
  53. private void formatDate() {
  54. dateString = DATE_FORMAT.format(new Date());
  55. }
  56. private void handlePlainText(HttpServerRequest req) {
  57. HttpServerResponse resp = req.response();
  58. setHeaders(resp, "text/plain", helloWorldContentLength);
  59. resp.end(helloWorldBuffer);
  60. }
  61. private void handleJson(HttpServerRequest req) {
  62. Buffer buff = new Buffer(Json.encode(Collections.singletonMap("message", "Hello, world!")));
  63. HttpServerResponse resp = req.response();
  64. setHeaders(resp, "application/json", String.valueOf(buff.length()));
  65. resp.end(buff);
  66. }
  67. private void handleDbMongo(final HttpServerRequest req) {
  68. findRandom(ThreadLocalRandom.current(), new Handler<Message<JsonObject>>() {
  69. @Override
  70. public void handle(Message<JsonObject> reply) {
  71. JsonObject world = getResultFromReply(reply);
  72. String result = world.encode();
  73. sendResponse(req, result);
  74. }
  75. });
  76. }
  77. private JsonObject getResultFromReply(Message<JsonObject> reply) {
  78. JsonObject body = reply.body();
  79. JsonObject world = body.getObject("result");
  80. Object id = world.removeField("_id");
  81. world.putValue("id", id);
  82. return world;
  83. }
  84. private void handleQueriesMongo(final HttpServerRequest req) {
  85. int queriesParam = 1;
  86. try {
  87. queriesParam = Integer.parseInt(req.params().get("queries"));
  88. } catch (NumberFormatException e) {
  89. e.printStackTrace();
  90. }
  91. if (queriesParam < 1)
  92. {
  93. queriesParam = 1;
  94. }
  95. if (queriesParam > 500)
  96. {
  97. queriesParam = 500;
  98. }
  99. final MongoHandler dbh = new MongoHandler(req, queriesParam);
  100. final Random random = ThreadLocalRandom.current();
  101. for (int i = 0; i < queriesParam; i++) {
  102. findRandom(random, dbh);
  103. }
  104. }
  105. private void findRandom(Random random, Handler<Message<JsonObject>> handler) {
  106. vertx.eventBus().send(
  107. "hello.persistor",
  108. new JsonObject()
  109. .putString("action", "findone")
  110. .putString("collection", "World")
  111. .putObject("matcher", new JsonObject().putNumber("_id", (random.nextInt(10000) + 1))),
  112. handler);
  113. }
  114. private void sendResponse(HttpServerRequest req, String result) {
  115. Buffer buff = new Buffer(result);
  116. HttpServerResponse resp = req.response();
  117. setHeaders(resp, "application/json", String.valueOf(buff.length()));
  118. resp.end(buff);
  119. }
  120. private void setHeaders(HttpServerResponse resp, String contentType, String contentLength) {
  121. resp.putHeader("Content-Type", contentType);
  122. resp.putHeader("Content-Length", contentLength);
  123. resp.putHeader("Server", "vert.x");
  124. resp.putHeader("Date", dateString);
  125. }
  126. private class MongoHandler implements Handler<Message<JsonObject>> {
  127. private final HttpServerRequest req;
  128. private final int queries;
  129. private final JsonArray worlds;
  130. public MongoHandler(HttpServerRequest request, int queriesParam) {
  131. req = request;
  132. queries = queriesParam;
  133. worlds = new JsonArray();
  134. }
  135. @Override
  136. public void handle(Message<JsonObject> reply) {
  137. JsonObject world = getResultFromReply(reply);
  138. worlds.add(world);
  139. if (worlds.size() == this.queries) {
  140. // All queries have completed; send the response.
  141. String result = worlds.encode();
  142. sendResponse(req, result);
  143. }
  144. }
  145. }
  146. }