HelloWebServer.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package hello;
  2. import co.paralleluniverse.embedded.containers.AbstractEmbeddedServer;
  3. import co.paralleluniverse.fibers.Suspendable;
  4. import co.paralleluniverse.fibers.servlet.FiberHttpServlet;
  5. import com.fasterxml.jackson.databind.ObjectMapper;
  6. import io.undertow.Undertow;
  7. import io.undertow.UndertowOptions;
  8. import io.undertow.server.HttpHandler;
  9. import io.undertow.servlet.Servlets;
  10. import io.undertow.servlet.api.DeploymentInfo;
  11. import io.undertow.servlet.api.DeploymentManager;
  12. import org.xnio.Options;
  13. import javax.servlet.ServletException;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletResponse;
  16. import java.io.IOException;
  17. import java.nio.charset.StandardCharsets;
  18. /**
  19. * An implementation of the TechEmpower benchmark tests using Comsat servlets and the Undertow servlet container.
  20. */
  21. public final class HelloWebServer {
  22. private static final class JsonServlet extends FiberHttpServlet {
  23. private static final class HelloWorldData {
  24. @SuppressWarnings("unused")
  25. public final String message = "Hello, World!";
  26. }
  27. private static final ObjectMapper mapper = new ObjectMapper();
  28. @Override
  29. @Suspendable
  30. protected final void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
  31. resp.setContentType("application/json");
  32. resp.setHeader("Server", "comsat-servlet-undertow");
  33. mapper.writeValue(resp.getOutputStream(), new HelloWorldData());
  34. }
  35. }
  36. private static final class PlaintextServlet extends FiberHttpServlet {
  37. private static final byte[] helloWorld = "Hello, World!".getBytes(StandardCharsets.ISO_8859_1);
  38. @Override
  39. @Suspendable
  40. protected final void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
  41. resp.setContentType("text/plain");
  42. resp.setHeader("Server", "comsat-servlet-undertow");
  43. resp.getOutputStream().write(helloWorld);
  44. }
  45. }
  46. public static void main(String[] args) throws Exception {
  47. final DeploymentInfo deployment = Servlets.deployment().setDeploymentName("")
  48. .setClassLoader(ClassLoader.getSystemClassLoader())
  49. .setContextPath("/");
  50. deployment.addServlet(Servlets.servlet("plaintext", PlaintextServlet.class).addMapping("/plaintext").setAsyncSupported(true));
  51. deployment.addServlet(Servlets.servlet("json", JsonServlet.class).addMapping("/json").setAsyncSupported(true));
  52. final DeploymentManager servletsContainer = Servlets.defaultContainer().addDeployment(deployment);
  53. servletsContainer.deploy();
  54. final HttpHandler handler = servletsContainer.start();
  55. //noinspection deprecation
  56. final Undertow server = Undertow.builder()
  57. .setHandler(handler)
  58. .setDirectBuffers(true)
  59. .setIoThreads(100)
  60. .setWorkerThreads(100)
  61. .setBufferSize(1024)
  62. .setBuffersPerRegion(100)
  63. // .setSocketOption(Options.ALLOW_BLOCKING, true)
  64. .setSocketOption(Options.REUSE_ADDRESSES, true)
  65. // .setSocketOption(Options.CORK, true)
  66. // .setSocketOption(Options.USE_DIRECT_BUFFERS, true)
  67. // .setSocketOption(Options.BACKLOG, Integer.MAX_VALUE)
  68. // .setSocketOption(Options.RECEIVE_BUFFER, 2048)
  69. // .setSocketOption(Options.SEND_BUFFER, 2048)
  70. // .setSocketOption(Options.CONNECTION_HIGH_WATER, Integer.MAX_VALUE)
  71. // .setSocketOption(Options.CONNECTION_LOW_WATER, Integer.MAX_VALUE)
  72. // .setSocketOption(Options.READ_TIMEOUT, Integer.MAX_VALUE)
  73. // .setSocketOption(Options.WRITE_TIMEOUT, Integer.MAX_VALUE)
  74. // .setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, false) //don't send a keep-alive header for HTTP/1.1 requests, as it is not required
  75. // .setServerOption(UndertowOptions.ALWAYS_SET_DATE, true)
  76. .setServerOption(UndertowOptions.ENABLE_CONNECTOR_STATISTICS, false)
  77. .setServerOption(UndertowOptions.RECORD_REQUEST_START_TIME, false)
  78. .addHttpListener(8080, "0.0.0.0")
  79. .build();
  80. server.start();
  81. System.err.println("Server is up.");
  82. Runtime.getRuntime().addShutdownHook(new Thread() {
  83. @Override
  84. public final void run() {
  85. try {
  86. server.stop();
  87. System.err.println("Server is down.");
  88. } catch (Exception e) {
  89. throw new RuntimeException(e);
  90. }
  91. }
  92. });
  93. new Thread() {
  94. @Override
  95. public final void run() {
  96. try {
  97. AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/plaintext");
  98. AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/json");
  99. System.err.println("Server test cases are instrumented and bootstrapped.");
  100. } catch (final InterruptedException | IOException e) {
  101. throw new RuntimeException(e);
  102. }
  103. }
  104. }.start();
  105. }
  106. }