Ver Fonte

Add graalvm tests for httpserver/httpserver-robaho/ring-http-exchange (#9968)

* Add graalvm to ring-http-exchange

Enable running ring-http-exchange on graalvm
Change group-id/artifactid/name in pom.xml to ring-http-exchage

* Add graalvm to httpserver and httpserver-robago

* merge httpserver and httpserver-robaho into single project

---------

Co-authored-by: jj <[email protected]>
ruroru há 2 meses atrás
pai
commit
1ec0fb2ebc
22 ficheiros alterados com 327 adições e 424 exclusões
  1. 42 0
      frameworks/Clojure/ring-http-exchange/benchmark_config.json
  2. 55 0
      frameworks/Clojure/ring-http-exchange/config.toml
  3. 13 0
      frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile
  4. 13 0
      frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile
  5. 0 32
      frameworks/Java/httpserver-robaho/README.md
  6. 0 44
      frameworks/Java/httpserver-robaho/benchmark_config.json
  7. 0 27
      frameworks/Java/httpserver-robaho/config.toml
  8. 0 83
      frameworks/Java/httpserver-robaho/pom.xml
  9. 0 25
      frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Fortune.java
  10. 0 26
      frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Message.java
  11. 0 139
      frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Server.java
  12. 0 13
      frameworks/Java/httpserver-robaho/src/main/resources/fortunes.template.httl
  13. 10 6
      frameworks/Java/httpserver/README.md
  14. 77 0
      frameworks/Java/httpserver/benchmark_config.json
  15. 55 0
      frameworks/Java/httpserver/config.toml
  16. 13 0
      frameworks/Java/httpserver/httpserver-graalvm.dockerfile
  17. 13 0
      frameworks/Java/httpserver/httpserver-robaho-graalvm.dockerfile
  18. 2 2
      frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile
  19. 2 2
      frameworks/Java/httpserver/httpserver-robaho.dockerfile
  20. 22 6
      frameworks/Java/httpserver/pom.xml
  21. 1 12
      frameworks/Java/httpserver/src/main/java/benchmarks/Message.java
  22. 9 7
      frameworks/Java/httpserver/src/main/java/benchmarks/Server.java

+ 42 - 0
frameworks/Clojure/ring-http-exchange/benchmark_config.json

@@ -40,8 +40,50 @@
         "database_os": "Linux",
         "display_name": "ring-http-exchange-robaho",
         "notes": "",
+        "versus": "httpserver-robaho"
+      }
+    },
+    {
+      "graalvm": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "None",
+        "language": "Clojure",
+        "flavor": "None",
+        "orm": "None",
+        "platform": "None",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "ring-http-exchange-graalvm",
+        "notes": "",
         "versus": "ring-http-exchange"
       }
+    },
+    {
+      "robaho-graalvm": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "None",
+        "language": "Clojure",
+        "flavor": "None",
+        "orm": "None",
+        "platform": "None",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "ring-http-exchange-robaho-graalvm",
+        "notes": "",
+        "versus": "ring-http-exchange-robaho"
+      }
     }
   ]
 }

+ 55 - 0
frameworks/Clojure/ring-http-exchange/config.toml

@@ -0,0 +1,55 @@
+[framework]
+name = "ring-http-exchange"
+
+[main]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+approach = "Realistic"
+classification = "Platform"
+database = "None"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "httpserver"
+webserver = "None"
+versus = "httpserver"
+
+
+[graalvm]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+approach = "Realistic"
+classification = "Platform"
+database = "None"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "httpserver"
+webserver = "None"
+versus = "httpserver-graalvm"
+
+[robaho]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+approach = "Realistic"
+classification = "Platform"
+database = "None"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "httpserver"
+webserver = "None"
+versus = "httpserver-robaho"
+
+[robaho-graalvm]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+approach = "Realistic"
+classification = "Platform"
+database = "None"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "httpserver"
+webserver = "None"
+versus = "httpserver-robaho-graalvm"

+ 13 - 0
frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile

@@ -0,0 +1,13 @@
+FROM maven:3-eclipse-temurin-24-alpine as maven
+WORKDIR /ring-http-exchange
+COPY pom.xml pom.xml
+COPY src src
+RUN mvn clean clojure:compile package
+
+FROM ghcr.io/graalvm/graalvm-community:24
+WORKDIR /ring-http-exchange
+COPY --from=maven /ring-http-exchange/target/ring-http-server-1.0.0-jar-with-dependencies.jar app.jar
+
+EXPOSE 8080
+
+CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar"]

+ 13 - 0
frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile

@@ -0,0 +1,13 @@
+FROM maven:3-eclipse-temurin-24-alpine as maven
+WORKDIR /ring-http-exchange
+COPY pom.xml pom.xml
+COPY src src
+RUN mvn clean clojure:compile -P robaho package
+
+FROM ghcr.io/graalvm/graalvm-community:24
+WORKDIR /ring-http-exchange
+COPY --from=maven /ring-http-exchange/target/ring-http-server-1.0.0-jar-with-dependencies.jar app.jar
+
+EXPOSE 8080
+
+CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar"]

+ 0 - 32
frameworks/Java/httpserver-robaho/README.md

@@ -1,32 +0,0 @@
-# httpserver Benchmarking Test
-
-This is an alternative version of the [httpserver benchmarking test suite](../httpserver)
-
-Package [robaho.net.httpserver](https://github.com/robaho/httpserver) provides an implementation of `com.sun.net.httpserver` designed for virtual threads, thus requiring JDK21+.
-
-It can be used with platform threads using a `cached thread pool` which configures a thread per task, which is more efficient for a small number of clients (embedded systems).
-
-### Test Type Implementation Source Code
-
-* [JSON](src/main/java/benchmarks/Server.java)
-* [Plaintext](src/main/java/benchmarks/Server.java)
-* [Fortunes](src/main/java/benchmarks/Server.java)
-
-## Important Libraries
-The tests were run with:
-* [Jackson](https://github.com/FasterXML/jackson)
-* [HikariCP](https://github.com/brettwooldridge/HikariCP)
-* [HTTL](https://httl.github.io/en/)
-
-## Test URLs
-### JSON
-
-http://localhost:8080/json
-
-### Plaintext
-
-http://localhost:8080/plaintext
-
-### Fortunes
-
-http://localhost:8080/fortunes

+ 0 - 44
frameworks/Java/httpserver-robaho/benchmark_config.json

@@ -1,44 +0,0 @@
-{
-  "framework": "httpserver-robaho",
-  "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": "httpserver",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "httpserver-robaho",
-        "notes": "",
-        "versus": ""
-      },
-      "postgres": {
-        "fortune_url": "/fortunes",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Platform",
-        "database": "Postgres",
-        "framework": "None",
-        "language": "Java",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "httpserver",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "httpserver-robaho-postgres",
-        "notes": "",
-        "versus": ""
-      }
-    }
-  ]
-}

+ 0 - 27
frameworks/Java/httpserver-robaho/config.toml

@@ -1,27 +0,0 @@
-[framework]
-name = "httpserver-robaho"
-
-[main]
-urls.plaintext = "/plaintext"
-urls.json = "/json"
-approach = "Realistic"
-classification = "Platform"
-database = "None"
-database_os = "Linux"
-os = "Linux"
-orm = "Raw"
-platform = "httpserver"
-webserver = "None"
-versus = ""
-
-[postgres]
-urls.fortune = "/fortunes"
-approach = "Realistic"
-classification = "Platform"
-database = "Postgres"
-database_os = "Linux"
-os = "Linux"
-orm = "Raw"
-platform = "httpserver"
-webserver = "None"
-versus = ""

+ 0 - 83
frameworks/Java/httpserver-robaho/pom.xml

@@ -1,83 +0,0 @@
-<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>httpserver-robaho</artifactId>
-    <version>1.0</version>
-    <packaging>jar</packaging>
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <maven.compiler.source>23</maven.compiler.source>
-        <maven.compiler.target>23</maven.compiler.target>
-        <java.version>23</java.version>
-    </properties>
-    <dependencies>
-        <dependency>
-            <groupId>com.googlecode.json-simple</groupId>
-            <artifactId>json-simple</artifactId>
-            <version>1.1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-            <version>42.7.2</version>
-        </dependency>
-        <dependency>
-            <groupId>com.zaxxer</groupId>
-            <artifactId>HikariCP</artifactId>
-            <version>3.3.1</version>
-        </dependency>
-        <dependency>
-            <groupId>com.github.httl</groupId>
-            <artifactId>httl</artifactId>
-            <version>1.0.11</version>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-simple</artifactId>
-            <version>1.7.25</version>
-        </dependency>
-        <dependency>
-            <groupId>io.github.robaho</groupId>
-            <artifactId>httpserver</artifactId>
-            <version>1.0.23</version>
-            <scope>compile</scope>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <inherited>true</inherited>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.8.0</version>
-                <configuration>
-                    <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>

+ 0 - 25
frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Fortune.java

@@ -1,25 +0,0 @@
-package benchmarks;
-
-public class Fortune implements Comparable<Fortune> {
-
-    private final int id;
-    private final String message;
-
-    public Fortune(int id, String message) {
-        this.id = id;
-        this.message = message;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    @Override
-    public int compareTo(Fortune other) {
-        return message.compareTo(other.message);
-    }
-}

+ 0 - 26
frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Message.java

@@ -1,26 +0,0 @@
-package benchmarks;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Map;
-
-import org.json.simple.JSONStreamAware;
-import org.json.simple.JSONValue;
-
-public class Message implements JSONStreamAware {
-
-    private final String message;
-
-    public Message(String message) {
-        this.message = message;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    @Override
-    public void writeJSONString(Writer out) throws IOException {
-        JSONValue.writeJSONString(Map.of("message",message), out);
-    }
-}

+ 0 - 139
frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Server.java

@@ -1,139 +0,0 @@
-package benchmarks;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.net.InetSocketAddress;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.Executors;
-
-import javax.sql.DataSource;
-
-import com.sun.net.httpserver.HttpHandler;
-import com.sun.net.httpserver.HttpServer;
-import com.zaxxer.hikari.HikariConfig;
-import com.zaxxer.hikari.HikariDataSource;
-
-import httl.Engine;
-import httl.Template;
-
-public class Server {
-
-    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 String SERVER_NAME = "httpserver-robaho";
-
-    private static List<Fortune> queryFortunes(DataSource ds) throws SQLException {
-        List<Fortune> fortunes = new ArrayList<>();
-        try (Connection conn = ds.getConnection();
-             PreparedStatement statement = conn.prepareStatement("SELECT id, message FROM fortune");
-             ResultSet resultSet = statement.executeQuery()) {
-            while (resultSet.next())
-                fortunes.add(new Fortune(resultSet.getInt(1), resultSet.getString(2)));
-        }
-        return fortunes;
-    }
-
-    private static DataSource createPostgresDataSource() throws ClassNotFoundException {
-        Class.forName("org.postgresql.Driver");
-        HikariConfig config = new HikariConfig();
-        config.setJdbcUrl("jdbc:postgresql://tfb-database:5432/hello_world");
-        config.setUsername("benchmarkdbuser");
-        config.setPassword("benchmarkdbpass");
-        config.setMaximumPoolSize(512);
-        return new HikariDataSource(config);
-    }
-
-    private static Template loadTemplate(String filename) throws IOException, ParseException {
-        Properties props = new Properties();
-        props.put("import.packages", "java.util," + Fortune.class.getPackage().getName());
-        props.put("input.encoding", "UTF-8");
-        props.put("output.encoding", "UTF-8");
-        props.put("precompiled", "false");
-        Engine engine = Engine.getEngine(props);
-        return engine.getTemplate(filename);
-    }
-
-    private static HttpHandler createPlaintextHandler() {
-        return t -> {
-            t.getResponseHeaders().add("Content-Type", "text/plain");
-            t.getResponseHeaders().add("Server", SERVER_NAME);
-            t.sendResponseHeaders(200, HELLO_LENGTH);
-            t.getResponseBody().write(HELLO_BYTES);
-            t.getResponseBody().close();
-        };
-    }
-
-    private static HttpHandler createJSONHandler() {
-        return t -> {
-            Message m = new Message(HELLO_TEXT);
-            t.getResponseHeaders().add("Content-Type", "application/json");
-            t.getResponseHeaders().add("Server", SERVER_NAME);
-            var bos = new ByteArrayOutputStream();
-            OutputStreamWriter w = new OutputStreamWriter(bos);
-            m.writeJSONString(w);
-            w.flush();
-            t.sendResponseHeaders(200, bos.size());
-            bos.writeTo(t.getResponseBody());
-            t.getResponseBody().close();
-        };
-    }
-
-    private static HttpHandler createFortunesHandler(DataSource ds) throws IOException, ParseException {
-        Template template = loadTemplate("/fortunes.template.httl");
-        return t -> {
-            try {
-                // query db
-                List<Fortune> fortunes = queryFortunes(ds);
-                fortunes.add(new Fortune(0, "Additional fortune added at request time."));
-                Collections.sort(fortunes);
-                // render template
-                Map<String, Object> context = new HashMap<>(1);
-                context.put("fortunes", fortunes);
-                ByteArrayOutputStream out = new ByteArrayOutputStream();
-                template.render(context, out);
-                byte[] bytes = out.toByteArray();
-                // send response
-                t.getResponseHeaders().add("Content-Type", "text/html; charset=utf-8");
-                t.getResponseHeaders().add("Server", SERVER_NAME);
-                t.sendResponseHeaders(200, bytes.length);
-                t.getResponseBody().write(bytes);
-                t.getResponseBody().close();
-            } catch (SQLException | ParseException e) {
-                throw new IOException(e);
-            }
-        };
-    }
-
-    public static void main(String[] args) throws Exception {
-        // parse arguments
-        String settings = args.length > 0 ? args[0] : "";
-        int port = args.length > 1 ? Integer.parseInt(args[1]) : 8080;
-        if (settings.contains("debug"))
-            System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "DEBUG");
-        // create server
-        HttpServer server = HttpServer.create(new InetSocketAddress(port), 1024 * 8);
-        server.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
-        // server.setExecutor(Executors.newCachedThreadPool());
-        // add context handlers
-        server.createContext("/plaintext", createPlaintextHandler());
-        server.createContext("/json", createJSONHandler());
-        if (settings.contains("postgres")) {
-            DataSource ds = createPostgresDataSource();
-            server.createContext("/fortunes", createFortunesHandler(ds));
-        }
-        // start server
-        server.start();
-    }
-}

+ 0 - 13
frameworks/Java/httpserver-robaho/src/main/resources/fortunes.template.httl

@@ -1,13 +0,0 @@
-<!--#set(List<Fortune> fortunes)-->
-<!DOCTYPE html>
-<html>
-<head><title>Fortunes</title></head>
-<body>
-<table>
-<tr><th>id</th><th>message</th></tr>
-<!-- #for(Fortune fortune : fortunes) -->
-<tr><td>${fortune.id}</td><td>${fortune.message}</td></tr>
-<!-- #end -->
-</table>
-</body>
-</html>

+ 10 - 6
frameworks/Java/httpserver/README.md

@@ -1,26 +1,30 @@
-# httpserver Benchmarking Test
-
-This is the com.sun.net.httpserver portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+# Benchmarking Test
+## httpserver
+This is the com.sun.net.httpserver portion of a [benchmarking test suite](../) comparing a variety of web development
+platforms.
 
 Package [com.sun.net.httpserver](https://docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html)
 provides a simple high-level Http server API, which can be used to build embedded HTTP servers.
 It is built-in to the Oracle JDK and OpenJDK (but is not part of the Java standard
 and is not available in other JDKs).
 
-
-
+## Robaho httpserver
+This is an alternative version of the [com.sun.net.httpserver](https://docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html)
+Package [robaho.net.httpserver](https://github.com/robaho/httpserver) provides an implementation of `com.sun.net.httpserver` designed for virtual threads, thus requiring JDK21+.
 
 ### Test Type Implementation Source Code
-
 * [JSON](src/main/java/benchmarks/Server.java)
 * [Plaintext](src/main/java/benchmarks/Server.java)
 * [Fortunes](src/main/java/benchmarks/Server.java)
 
 ## Important Libraries
+
 The tests were run with:
+
 * [Jackson](https://github.com/FasterXML/jackson)
 * [HikariCP](https://github.com/brettwooldridge/HikariCP)
 * [HTTL](https://httl.github.io/en/)
+* [Robaho httpserver](https://github.com/robaho/httpserver)
 
 ## Test URLs
 ### JSON

+ 77 - 0
frameworks/Java/httpserver/benchmark_config.json

@@ -38,6 +38,83 @@
         "display_name": "httpserver-postgres",
         "notes": "",
         "versus": ""
+      },
+      "graalvm": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "None",
+        "language": "Java",
+        "flavor": "None",
+        "orm": "Raw",
+        "platform": "httpserver",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "httpserver-graalvm",
+        "notes": "",
+        "versus": "httpserver"
+      }
+    },
+    {
+      "robaho": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "None",
+        "language": "Java",
+        "flavor": "None",
+        "orm": "Raw",
+        "platform": "httpserver",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "httpserver-robaho",
+        "notes": "",
+        "versus": ""
+      },
+      "robaho-postgres": {
+        "fortune_url": "/fortunes",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "Postgres",
+        "framework": "None",
+        "language": "Java",
+        "flavor": "None",
+        "orm": "Raw",
+        "platform": "httpserver",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "httpserver-robaho-postgres",
+        "notes": "",
+        "versus": ""
+      },
+      "robaho-graalvm": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "None",
+        "language": "Java",
+        "flavor": "None",
+        "orm": "Raw",
+        "platform": "httpserver",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "httpserver-robaho-graalvm",
+        "notes": "",
+        "versus": "httpserver-robaho"
       }
     }
   ]

+ 55 - 0
frameworks/Java/httpserver/config.toml

@@ -25,3 +25,58 @@ orm = "Raw"
 platform = "httpserver"
 webserver = "None"
 versus = ""
+
+
+[graalvm]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+approach = "Realistic"
+classification = "Platform"
+database = "None"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "httpserver"
+webserver = "None"
+versus = "httpserver"
+
+
+[robaho]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+approach = "Realistic"
+classification = "Platform"
+database = "None"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "httpserver"
+webserver = "None"
+versus = "httpserver"
+
+
+[robaho-postgres]
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Platform"
+database = "Postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "httpserver"
+webserver = "None"
+versus = ""
+
+
+[robaho-graalvm]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+approach = "Realistic"
+classification = "Platform"
+database = "None"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "httpserver"
+webserver = "None"
+versus = "httpserver-robaho"

+ 13 - 0
frameworks/Java/httpserver/httpserver-graalvm.dockerfile

@@ -0,0 +1,13 @@
+FROM maven:3-eclipse-temurin-24-alpine as maven
+WORKDIR /httpserver
+COPY pom.xml pom.xml
+COPY src src
+RUN mvn compile assembly:single -q
+
+FROM ghcr.io/graalvm/graalvm-community:24
+WORKDIR /httpserver
+COPY --from=maven /httpserver/target/httpserver-1.0-jar-with-dependencies.jar app.jar
+
+EXPOSE 8080
+
+CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-jar", "app.jar"]

+ 13 - 0
frameworks/Java/httpserver/httpserver-robaho-graalvm.dockerfile

@@ -0,0 +1,13 @@
+FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven
+WORKDIR /httpserver-robaho
+COPY pom.xml pom.xml
+COPY src src
+RUN mvn compile -P robaho assembly:single -q
+
+FROM ghcr.io/graalvm/graalvm-community:24
+WORKDIR /httpserver-robaho
+COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar
+
+EXPOSE 8080
+
+CMD ["java", "-server", "-jar", "app.jar"]

+ 2 - 2
frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile → frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile

@@ -2,11 +2,11 @@ FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven
 WORKDIR /httpserver-robaho
 COPY pom.xml pom.xml
 COPY src src
-RUN mvn compile assembly:single -q
+RUN mvn compile -P robaho assembly:single -q
 
 FROM openjdk:23-jdk-slim
 WORKDIR /httpserver-robaho
-COPY --from=maven /httpserver-robaho/target/httpserver-robaho-1.0-jar-with-dependencies.jar app.jar
+COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar
 
 EXPOSE 8080
 

+ 2 - 2
frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile → frameworks/Java/httpserver/httpserver-robaho.dockerfile

@@ -2,11 +2,11 @@ FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven
 WORKDIR /httpserver-robaho
 COPY pom.xml pom.xml
 COPY src src
-RUN mvn compile assembly:single -q
+RUN mvn compile -P robaho assembly:single -q
 
 FROM openjdk:23-jdk-slim
 WORKDIR /httpserver-robaho
-COPY --from=maven /httpserver-robaho/target/httpserver-robaho-1.0-jar-with-dependencies.jar app.jar
+COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar
 
 EXPOSE 8080
 

+ 22 - 6
frameworks/Java/httpserver/pom.xml

@@ -1,5 +1,5 @@
 <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">
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
     <modelVersion>4.0.0</modelVersion>
 
@@ -10,22 +10,21 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <maven.compiler.source>11</maven.compiler.source>
-        <maven.compiler.target>11</maven.compiler.target>
+        <maven.compiler.source>21</maven.compiler.source>
+        <maven.compiler.target>21</maven.compiler.target>
     </properties>
 
     <dependencies>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
-            <version>2.16.0</version>
+            <version>2.19.1</version>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.module</groupId>
             <artifactId>jackson-module-afterburner</artifactId>
-            <version>2.9.9</version>
+            <version>2.19.1</version>
         </dependency>
-
         <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
@@ -49,6 +48,21 @@
             <version>1.8.0-beta4</version>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <id>robaho</id>
+            <activation>
+                <activeByDefault>false</activeByDefault>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>io.github.robaho</groupId>
+                    <artifactId>httpserver</artifactId>
+                    <version>1.0.23</version>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 
     <build>
         <plugins>
@@ -59,6 +73,8 @@
                 <version>3.8.0</version>
                 <configuration>
                     <debug>false</debug>
+                    <source>21</source>
+                    <target>21</target>
                 </configuration>
             </plugin>
             <plugin>

+ 1 - 12
frameworks/Java/httpserver/src/main/java/benchmarks/Message.java

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

+ 9 - 7
frameworks/Java/httpserver/src/main/java/benchmarks/Server.java

@@ -8,18 +8,23 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.text.ParseException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
 import java.util.concurrent.Executors;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
+
 import javax.sql.DataSource;
+
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
 import com.sun.net.httpserver.HttpHandler;
 import com.sun.net.httpserver.HttpServer;
 import com.zaxxer.hikari.HikariConfig;
 import com.zaxxer.hikari.HikariDataSource;
+
 import httl.Engine;
 import httl.Template;
 
@@ -72,7 +77,6 @@ public class Server {
             t.getResponseHeaders().add("Server", SERVER_NAME);
             t.sendResponseHeaders(200, HELLO_LENGTH);
             t.getResponseBody().write(HELLO_BYTES);
-            t.getResponseBody().flush();
             t.getResponseBody().close();
         };
     }
@@ -116,7 +120,6 @@ public class Server {
                 t.getResponseHeaders().add("Server", SERVER_NAME);
                 t.sendResponseHeaders(200, bytes.length);
                 t.getResponseBody().write(bytes);
-                t.getResponseBody().flush();
                 t.getResponseBody().close();
             } catch (SQLException | ParseException e) {
                 throw new IOException(e);
@@ -133,7 +136,6 @@ public class Server {
         // create server
         HttpServer server = HttpServer.create(new InetSocketAddress(port), 1024 * 8);
         server.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
-        // add context handlers
         server.createContext("/plaintext", createPlaintextHandler());
         server.createContext("/json", createJSONHandler());
         if (settings.contains("postgres")) {