Browse Source

Add NanoHTTPD framework (#3857)

amichair 7 years ago
parent
commit
c817d5fcfa

+ 1 - 0
.travis.yml

@@ -53,6 +53,7 @@ env:
      - "TESTDIR=Java/jooby"
      - "TESTDIR=Java/light-java"
      - "TESTDIR=Java/minijax"
+     - "TESTDIR=Java/nanohttpd"
      - "TESTDIR=Java/netty"
      - "TESTDIR=Java/ninja-standalone"
      - "TESTDIR=Java/play1"

+ 21 - 0
frameworks/Java/nanohttpd/README.md

@@ -0,0 +1,21 @@
+# NanoHTTPD Benchmarking Test
+
+[NanoHTTPD](https://github.com/NanoHttpd/nanohttpd) is a tiny, easily embeddable HTTP server in Java.
+
+### Test Type Implementation Source Code
+
+* [JSON](src/main/java/benchmarks/Server.java)
+* [Plaintext](src/main/java/benchmarks/Server.java)
+
+## Important Libraries
+The tests were run with:
+* [Jackson](https://github.com/FasterXML/jackson)
+
+## Test URLs
+### JSON
+
+http://localhost:8080/json
+
+### PLAINTEXT
+
+http://localhost:8080/plaintext

+ 26 - 0
frameworks/Java/nanohttpd/benchmark_config.json

@@ -0,0 +1,26 @@
+{
+  "framework": "nanohttpd",
+  "tests": [
+    {
+      "default": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "None",
+        "language": "Java",
+        "flavor": "None",
+        "orm": "Raw",
+        "platform": "None",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "NanoHTTPD",
+        "notes": "",
+        "versus": ""
+      }
+    }
+  ]
+}

+ 10 - 0
frameworks/Java/nanohttpd/nanohttpd.dockerfile

@@ -0,0 +1,10 @@
+FROM maven:3.5.3-jdk-10-slim as maven
+WORKDIR /nanohttpd
+COPY pom.xml pom.xml
+COPY src src
+RUN mvn compile assembly:single -q
+
+FROM openjdk:10-jre-slim
+WORKDIR /nanohttpd
+COPY --from=maven /nanohttpd/target/nanohttpd-1.0-jar-with-dependencies.jar app.jar
+CMD ["java", "-server", "-Xss256k", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-jar", "app.jar"]

+ 72 - 0
frameworks/Java/nanohttpd/pom.xml

@@ -0,0 +1,72 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.techempower</groupId>
+    <artifactId>nanohttpd</artifactId>
+    <version>1.0</version>
+    <packaging>jar</packaging>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.nanohttpd</groupId>
+            <artifactId>nanohttpd</artifactId>
+            <version>2.3.1</version>
+        </dependency>
+    <dependency>
+        <groupId>com.fasterxml.jackson.core</groupId>
+        <artifactId>jackson-databind</artifactId>
+        <version>2.9.5</version>
+    </dependency>
+    <dependency>
+        <groupId>com.fasterxml.jackson.module</groupId>
+        <artifactId>jackson-module-afterburner</artifactId>
+        <version>2.9.5</version>
+    </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <inherited>true</inherited>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.7.0</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <optimize>true</optimize>
+                    <debug>false</debug>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>3.1.0</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>benchmarks.Server</mainClass>
+                        </manifest>
+                    </archive>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 15 - 0
frameworks/Java/nanohttpd/src/main/java/benchmarks/Message.java

@@ -0,0 +1,15 @@
+package benchmarks;
+
+public class Message {
+
+    private final String message;
+
+    public Message(String message) {
+        this.message = message;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+}

+ 57 - 0
frameworks/Java/nanohttpd/src/main/java/benchmarks/Server.java

@@ -0,0 +1,57 @@
+package benchmarks;
+
+import java.io.ByteArrayInputStream;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
+import fi.iki.elonen.NanoHTTPD;
+
+public class Server extends NanoHTTPD {
+
+    private static final String SERVER_NAME = "NanoHTTPD";
+    private static final String HELLO_TEXT = "Hello, World!";
+    private static final byte[] HELLO_BYTES = HELLO_TEXT.getBytes();
+    private static final int HELLO_LENGTH = HELLO_BYTES.length;
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+
+    static {
+        MAPPER.registerModule(new AfterburnerModule());
+    }
+
+    public Server(int port) {
+        super(port);
+    }
+
+    @Override public Response serve(IHTTPSession session) {
+        Response response;
+        switch (session.getUri()) {
+
+            case "/plaintext":
+                response = newFixedLengthResponse(Response.Status.OK, "text/plain",
+                    new ByteArrayInputStream(HELLO_BYTES), HELLO_LENGTH);
+                response.addHeader("Server", SERVER_NAME);
+                return response;
+
+            case "/json":
+                Message msg = new Message(HELLO_TEXT);
+                byte[] bytes;
+                try {
+                    bytes = MAPPER.writeValueAsBytes(msg);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+                response = newFixedLengthResponse(Response.Status.OK, "application/json",
+                    new ByteArrayInputStream(bytes), bytes.length);
+                response.addHeader("Server", SERVER_NAME);
+                return response;
+
+            default:
+                return newFixedLengthResponse(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "Not found");
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        int port = args.length > 0 ? Integer.parseInt(args[0]) : 8080;
+        NanoHTTPD server = new Server(port);
+        server.start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);
+    }
+}