Forráskód Böngészése

[quarkus] Upgrade Quarkus version and removing test cases (#7354)

Co-authored-by: Sanne Grinovero <[email protected]>
Francesco Nigro 3 éve
szülő
commit
07d9da7ba2
95 módosított fájl, 716 hozzáadás és 2370 törlés
  1. 2 5
      frameworks/Java/quarkus/README.md
  2. 1 70
      frameworks/Java/quarkus/benchmark_config.json
  3. 2 53
      frameworks/Java/quarkus/config.toml
  4. 12 24
      frameworks/Java/quarkus/pom.xml
  5. 37 0
      frameworks/Java/quarkus/quarkus-benchmark-common/pom.xml
  6. 21 0
      frameworks/Java/quarkus/quarkus-benchmark-common/src/main/java/io/quarkus/benchmark/utils/LocalRandom.java
  7. 78 0
      frameworks/Java/quarkus/quarkus-benchmark-common/src/main/java/io/quarkus/benchmark/utils/Randomizer.java
  8. 62 0
      frameworks/Java/quarkus/quarkus-benchmark-common/src/test/java/io/quarkus/benchmark/utils/LocalRandomTest.java
  9. 0 31
      frameworks/Java/quarkus/quarkus-reactive-routes-hibernate-reactive.dockerfile
  10. 0 31
      frameworks/Java/quarkus/quarkus-reactive-routes-pgclient.dockerfile
  11. 17 9
      frameworks/Java/quarkus/quarkus-resteasy-reactive-hibernate-reactive.dockerfile
  12. 17 9
      frameworks/Java/quarkus/quarkus-resteasy-reactive-hibernate.dockerfile
  13. 0 31
      frameworks/Java/quarkus/quarkus-resteasy-reactive-pgclient.dockerfile
  14. 17 9
      frameworks/Java/quarkus/quarkus.dockerfile
  15. 0 46
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/pom.xml
  16. 0 28
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java
  17. 0 56
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/model/Fortune.java
  18. 0 29
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/model/World.java
  19. 0 19
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/BaseRepository.java
  20. 0 25
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java
  21. 0 65
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java
  22. 0 34
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/BaseResource.java
  23. 0 130
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/DbResource.java
  24. 0 47
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java
  25. 0 21
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/JsonResource.java
  26. 0 17
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java
  27. 0 20
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/resources/application.properties
  28. 0 20
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/resources/fortunes.mustache
  29. 0 2
      frameworks/Java/quarkus/reactive-routes-hibernate-reactive/start-app.sh
  30. 0 43
      frameworks/Java/quarkus/reactive-routes-pgclient/pom.xml
  31. 0 33
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java
  32. 0 48
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/Fortune.java
  33. 0 35
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/World.java
  34. 0 30
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java
  35. 0 56
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java
  36. 0 38
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClients.java
  37. 0 40
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java
  38. 0 20
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/BaseResource.java
  39. 0 85
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java
  40. 0 49
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java
  41. 0 18
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonResource.java
  42. 0 13
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/Message.java
  43. 0 23
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java
  44. 0 9
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/application.properties
  45. 0 20
      frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/fortunes.mustache
  46. 0 2
      frameworks/Java/quarkus/reactive-routes-pgclient/start-app.sh
  47. 35 5
      frameworks/Java/quarkus/resteasy-hibernate/pom.xml
  48. 7 1
      frameworks/Java/quarkus/resteasy-hibernate/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java
  49. 17 24
      frameworks/Java/quarkus/resteasy-hibernate/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java
  50. 21 0
      frameworks/Java/quarkus/resteasy-hibernate/src/main/resources/Fortunes.rocker.html
  51. 9 2
      frameworks/Java/quarkus/resteasy-hibernate/src/main/resources/application.properties
  52. 0 20
      frameworks/Java/quarkus/resteasy-hibernate/src/main/resources/fortunes.mustache
  53. 0 1
      frameworks/Java/quarkus/resteasy-hibernate/start-app.sh
  54. 28 6
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/pom.xml
  55. 11 3
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java
  56. 7 2
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/BaseRepository.java
  57. 3 7
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java
  58. 38 22
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java
  59. 27 51
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/DbResource.java
  60. 17 21
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java
  61. 7 0
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/JsonResource.java
  62. 16 1
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java
  63. 21 0
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/resources/Fortunes.rocker.html
  64. 12 3
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/resources/application.properties
  65. 0 20
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/resources/fortunes.mustache
  66. 0 2
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/start-app.sh
  67. 36 5
      frameworks/Java/quarkus/resteasy-reactive-hibernate/pom.xml
  68. 7 1
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java
  69. 14 15
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java
  70. 12 56
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/DbResource.java
  71. 15 24
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java
  72. 3 0
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/JsonResource.java
  73. 21 4
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java
  74. 21 0
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/resources/Fortunes.rocker.html
  75. 7 2
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/resources/application.properties
  76. 0 20
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/resources/fortunes.mustache
  77. 0 1
      frameworks/Java/quarkus/resteasy-reactive-hibernate/start-app.sh
  78. 0 117
      frameworks/Java/quarkus/resteasy-reactive-pgclient/.factorypath
  79. 0 47
      frameworks/Java/quarkus/resteasy-reactive-pgclient/pom.xml
  80. 0 33
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java
  81. 0 48
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/model/Fortune.java
  82. 0 35
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/model/World.java
  83. 0 30
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java
  84. 0 56
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java
  85. 0 38
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClients.java
  86. 0 40
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java
  87. 0 83
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java
  88. 0 47
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java
  89. 0 19
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonResource.java
  90. 0 13
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/resource/Message.java
  91. 0 20
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java
  92. 0 10
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/resources/application.properties
  93. 0 20
      frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/resources/fortunes.mustache
  94. 0 2
      frameworks/Java/quarkus/resteasy-reactive-pgclient/start-app.sh
  95. 38 0
      frameworks/Java/quarkus/run_quarkus.sh

+ 2 - 5
frameworks/Java/quarkus/README.md

@@ -4,19 +4,16 @@ This is the Quarkus portion of a [benchmarking test suite](../) comparing a vari
 
 ## Implementations
 
-There are currently 6 repository implementations:
+There are currently 3 implementations:
 
 - RESTEasy and Hibernate ORM
 - RESTEasy Reactive and Hibernate ORM
 - RESTEasy Reactive and Hibernate Reactive
-- RESTEasy Reactive and Vert.x PG Client
-- Reactive Routes and Hibernate Reactive
-- Reactive Routes and Vert.x PG Client
 
 ## Versions
 
 * [Java OpenJDK 11](http://openjdk.java.net/)
-* [Quarkus 1.11.0.Beta1](https://quarkus.io)
+* [Quarkus 2.9.1.Final](https://quarkus.io)
 
 ## Test URLs
 

+ 1 - 70
frameworks/Java/quarkus/benchmark_config.json

@@ -25,75 +25,6 @@
         "notes": "",
         "versus": "Netty"
       },
-      "reactive-routes-hibernate-reactive": {
-        "json_url": "/json",
-        "db_url": "/db",
-        "query_url": "/queries?queries=",
-        "update_url": "/updates?queries=",
-        "fortune_url": "/fortunes",
-        "plaintext_url": "/plaintext",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "fullstack",
-        "database": "Postgres",
-        "framework": "Quarkus",
-        "language": "Java",
-        "flavor": "None",
-        "orm": "Full",
-        "platform": "Vertx-Web",
-        "webserver": "Vertx",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "Quarkus + Reactive Routes + Hibernate Reactive",
-        "notes": "",
-        "versus": "Netty"
-      },
-      "reactive-routes-pgclient": {
-        "json_url": "/json",
-        "db_url": "/db",
-        "query_url": "/queries?queries=",
-        "update_url": "/updates?queries=",
-        "fortune_url": "/fortunes",
-        "plaintext_url": "/plaintext",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "fullstack",
-        "database": "Postgres",
-        "framework": "Quarkus",
-        "language": "Java",
-        "flavor": "None",
-        "orm": "Micro",
-        "platform": "Vertx-Web",
-        "webserver": "Vertx",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "Quarkus + Reactive Routes + PgClient",
-        "notes": "",
-        "versus": "Netty"
-      },
-      "resteasy-reactive-pgclient": {
-        "json_url": "/json",
-        "db_url": "/db",
-        "query_url": "/queries?queries=",
-        "update_url": "/updates?queries=",
-        "fortune_url": "/fortunes",
-        "plaintext_url": "/plaintext",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "fullstack",
-        "database": "Postgres",
-        "framework": "Quarkus",
-        "language": "Java",
-        "flavor": "None",
-        "orm": "Micro",
-        "platform": "RESTEasy Reactive",
-        "webserver": "Vertx",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "Quarkus RESTEasy Reactive + PgClient",
-        "notes": "",
-        "versus": "Netty"
-      },
       "resteasy-reactive-hibernate": {
         "json_url": "/json",
         "db_url": "/db",
@@ -113,7 +44,7 @@
         "webserver": "Vertx",
         "os": "Linux",
         "database_os": "Linux",
-        "display_name": "Quarkus RESTEasy Reactive + Hibernate",
+        "display_name": "Quarkus RESTEasy Reactive + Hibernate ORM",
         "notes": "",
         "versus": "Netty"
       },

+ 2 - 53
frameworks/Java/quarkus/config.toml

@@ -1,23 +1,6 @@
 [framework]
 name = "quarkus"
 
-[resteasy-reactive-pgclient]
-urls.plaintext = "/plaintext"
-urls.json = "/json"
-urls.db = "/db"
-urls.query = "/queries?queries="
-urls.update = "/updates?queries="
-urls.fortune = "/fortunes"
-approach = "Realistic"
-classification = "fullstack"
-database = "Postgres"
-database_os = "Linux"
-os = "Linux"
-orm = "Micro"
-platform = "RESTEasy Reactive"
-webserver = "Vertx"
-versus = "Netty"
-
 [main]
 urls.plaintext = "/plaintext"
 urls.json = "/json"
@@ -35,40 +18,6 @@ platform = "JAX-RS"
 webserver = "Undertow"
 versus = "Netty"
 
-[reactive-routes-pgclient]
-urls.plaintext = "/plaintext"
-urls.json = "/json"
-urls.db = "/db"
-urls.query = "/queries?queries="
-urls.update = "/updates?queries="
-urls.fortune = "/fortunes"
-approach = "Realistic"
-classification = "fullstack"
-database = "Postgres"
-database_os = "Linux"
-os = "Linux"
-orm = "Micro"
-platform = "Vertx-Web"
-webserver = "Vertx"
-versus = "Netty"
-
-[reactive-routes-hibernate-reactive]
-urls.plaintext = "/plaintext"
-urls.json = "/json"
-urls.db = "/db"
-urls.query = "/queries?queries="
-urls.update = "/updates?queries="
-urls.fortune = "/fortunes"
-approach = "Realistic"
-classification = "fullstack"
-database = "Postgres"
-database_os = "Linux"
-os = "Linux"
-orm = "Full"
-platform = "Vertx-Web"
-webserver = "Vertx"
-versus = "Netty"
-
 [resteasy-reactive-hibernate]
 urls.plaintext = "/plaintext"
 urls.json = "/json"
@@ -81,7 +30,7 @@ classification = "fullstack"
 database = "Postgres"
 database_os = "Linux"
 os = "Linux"
-orm = "Micro"
+orm = "Full"
 platform = "RESTEasy Reactive"
 webserver = "Vertx"
 versus = "Netty"
@@ -98,7 +47,7 @@ classification = "fullstack"
 database = "Postgres"
 database_os = "Linux"
 os = "Linux"
-orm = "Micro"
+orm = "Full"
 platform = "RESTEasy Reactive"
 webserver = "Vertx"
 versus = "Netty"

+ 12 - 24
frameworks/Java/quarkus/pom.xml

@@ -8,7 +8,7 @@
     <packaging>pom</packaging>
 
     <properties>
-        <quarkus.version>1.11.0.Beta1</quarkus.version>
+        <quarkus.version>2.9.1.Final</quarkus.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>11</maven.compiler.source>
         <maven.compiler.target>11</maven.compiler.target>
@@ -16,41 +16,29 @@
 
     <modules>
         <module>resteasy-hibernate</module>
-        <module>reactive-routes-hibernate-reactive</module>
-        <module>reactive-routes-pgclient</module>
-        <module>resteasy-reactive-pgclient</module>
         <module>resteasy-reactive-hibernate</module>
         <module>resteasy-reactive-hibernate-reactive</module>
+        <module>quarkus-benchmark-common</module>
     </modules>
 
     <dependencyManagement>
         <dependencies>
             <dependency>
-                <groupId>io.quarkus</groupId>
-                <artifactId>quarkus-bom</artifactId>
-                <version>${quarkus.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
+                <groupId>org.hibernate.reactive</groupId>
+                <artifactId>hibernate-reactive-core</artifactId>
+                <version>1.1.6.Final</version>
             </dependency>
             <dependency>
-                <groupId>io.quarkus.benchmark</groupId>
-                <artifactId>base</artifactId>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-benchmark-common</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
-                <groupId>io.vertx</groupId>
-                <artifactId>vertx-pg-client</artifactId>
-                <version>3.9.0</version>
-            </dependency>
-            <dependency>
-                <groupId>io.vertx</groupId>
-                <artifactId>vertx-sql-client</artifactId>
-                <version>3.9.0</version>
-            </dependency>
-            <dependency>
-                <groupId>io.vertx</groupId>
-                <artifactId>vertx-web</artifactId>
-                <version>3.9.3</version>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-bom</artifactId>
+                <version>${quarkus.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
             </dependency>
         </dependencies>
     </dependencyManagement>

+ 37 - 0
frameworks/Java/quarkus/quarkus-benchmark-common/pom.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>benchmark</artifactId>
+        <groupId>io.quarkus</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>quarkus-benchmark-common</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-common</artifactId>
+        </dependency>
+    </dependencies>
+    <profiles>
+        <profile>
+            <id>skip.tests.by.default</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <properties>
+                <maven.test.skip>true</maven.test.skip>
+            </properties>
+        </profile>
+    </profiles>
+
+</project>

+ 21 - 0
frameworks/Java/quarkus/quarkus-benchmark-common/src/main/java/io/quarkus/benchmark/utils/LocalRandom.java

@@ -0,0 +1,21 @@
+package io.quarkus.benchmark.utils;
+
+public interface LocalRandom {
+
+    /**
+     * @return an Integer representing a random number in the space expected by the benchmark: [1-10000].
+     */
+    Integer getNextRandom();
+
+    /**
+     * Also according to benchmark requirements, except that in this special case
+     * of the update test we need to ensure we'll actually generate an update operation:
+     * for this we need to generate a random number between 1 to 10000, but different
+     * from the current field value.
+     *
+     * @param exclusion
+     * @return an Integer representing a random number in the space expected by the benchmark: [1-10000],
+     * but always excluding the one matching exclusion.
+     */
+    Integer getNextRandomExcluding(int exclusion);
+}

+ 78 - 0
frameworks/Java/quarkus/quarkus-benchmark-common/src/main/java/io/quarkus/benchmark/utils/Randomizer.java

@@ -0,0 +1,78 @@
+package io.quarkus.benchmark.utils;
+
+import io.netty.util.concurrent.FastThreadLocal;
+
+import java.util.ArrayList;
+
+/**
+ * The rules of the benchmark frequently require randomly generated numbers
+ * in the range from 1 to 10000.
+ * Often multiple numbers are needed, and in this case we need to avoid duplicates
+ * because otherwise the ORM optimisations will invalidate our operations
+ * (Hibernate ORM will skip unnecessary operations but this is specifically disallowed,
+ * and it's not possible to disable this behaviour in ORM as it's an intrinsic
+ * aspect of correctness of an ORM).
+ * Because of this twist in the rules, we're better off writing a custom helper
+ * than making vanilla use of the Java platform randomizer.
+ */
+public final class Randomizer {
+
+    static final short MIN_OF_RANGE = 1;
+    static final short MAX_OF_RANGE = 10000;
+    static final short RANGE_SPACE = MAX_OF_RANGE - MIN_OF_RANGE + 1;
+    private final static Integer[] randomSequenceBoxed = initRange();
+
+    private static final FastThreadLocal<ThreadlocalizedRandomizer> localRandom = new FastThreadLocal<>() {
+        @Override
+        protected io.quarkus.benchmark.utils.Randomizer.ThreadlocalizedRandomizer initialValue() {
+            return new ThreadlocalizedRandomizer();
+        }
+    };
+
+    public static LocalRandom current() {
+        return localRandom.get();
+    }
+
+    private static Integer[] initRange() {
+        ArrayList<Integer> boxedSequence = new java.util.ArrayList<>(MAX_OF_RANGE);
+        short value = MIN_OF_RANGE;
+        for (int i = 0; i < MAX_OF_RANGE; i++) {
+            boxedSequence.add(Integer.valueOf(value++));
+        }
+        java.util.Collections.shuffle(boxedSequence);
+        return boxedSequence.toArray(new Integer[0]);
+    }
+
+    private static final class ThreadlocalizedRandomizer implements LocalRandom {
+
+        private final java.util.concurrent.ThreadLocalRandom random;
+        private int currentIndex;
+
+        private ThreadlocalizedRandomizer() {
+            this.random = java.util.concurrent.ThreadLocalRandom.current();
+            this.currentIndex = random.nextInt(RANGE_SPACE);
+        }
+
+        @Override
+        public Integer getNextRandom() {
+            currentIndex++;
+            if (currentIndex == MAX_OF_RANGE) {
+                currentIndex = 0;
+            }
+            return randomSequenceBoxed[currentIndex];
+        }
+
+        @Override
+        public Integer getNextRandomExcluding(int exclusion) {
+            final Integer nextRandom = getNextRandom();
+            if (nextRandom.intValue() == exclusion) {
+                //Since it's a sequence of shuffled unique numbers, and this is consumed by a single thread,
+                //we know at this stage the next try will be different for sure.
+                return getNextRandom();
+            }
+            return nextRandom;
+        }
+
+    }
+
+}

+ 62 - 0
frameworks/Java/quarkus/quarkus-benchmark-common/src/test/java/io/quarkus/benchmark/utils/LocalRandomTest.java

@@ -0,0 +1,62 @@
+package io.quarkus.benchmark.utils;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class LocalRandomTest {
+
+    /**
+     * Testing {@link LocalRandom#getNextRandom()}
+     */
+    @Test
+    public void fullCoverage() {
+        int[] results = new int[Randomizer.MAX_OF_RANGE + 1];
+        final LocalRandom random = Randomizer.current();
+        for (int i = 0; i < Randomizer.RANGE_SPACE; i++) {
+            final int value = random.getNextRandom().intValue();
+            results[value]++;
+        }
+        for (int i = 0; i < Randomizer.MIN_OF_RANGE; i++) {
+            assertEquals(0, results[i]);
+        }
+        for (int i = Randomizer.MIN_OF_RANGE; i < Randomizer.MAX_OF_RANGE + 1; i++) {
+            assertEquals(1, results[i]);
+        }
+        for (int i = 0; i < Randomizer.RANGE_SPACE; i++) {
+            final int value = random.getNextRandom().intValue();
+            results[value]++;
+        }
+        for (int i = Randomizer.MIN_OF_RANGE; i < Randomizer.MAX_OF_RANGE + 1; i++) {
+            assertEquals(2, results[i]);
+        }
+    }
+
+    /**
+     * Testing {@link LocalRandom#getNextRandomExcluding(int)}
+     */
+    @Test
+    public void fullCoverageExcept() {
+        final int except = 37;
+        int[] results = new int[Randomizer.MAX_OF_RANGE + 1];
+        final LocalRandom random = Randomizer.current();
+        for (int i = 0; i < Randomizer.RANGE_SPACE - 1; i++) {
+            final int value = random.getNextRandomExcluding(except).intValue();
+            results[value]++;
+        }
+        for (int i = 0; i < Randomizer.MIN_OF_RANGE; i++) {
+            assertEquals(0, results[i]);
+        }
+        for (int i = Randomizer.MIN_OF_RANGE; i < Randomizer.MAX_OF_RANGE + 1; i++) {
+            assertEquals((i == except ? 0 : 1), results[i]);
+        }
+        for (int i = 0; i < Randomizer.RANGE_SPACE - 1; i++) {
+            final int value = random.getNextRandomExcluding(except).intValue();
+            results[value]++;
+        }
+        for (int i = Randomizer.MIN_OF_RANGE; i < Randomizer.MAX_OF_RANGE + 1; i++) {
+            assertEquals((i == except ? 0 : 2), results[i]);
+        }
+    }
+
+}

+ 0 - 31
frameworks/Java/quarkus/quarkus-reactive-routes-hibernate-reactive.dockerfile

@@ -1,31 +0,0 @@
-FROM maven:3.6.3-jdk-11-slim as maven
-WORKDIR /quarkus
-ENV MODULE=reactive-routes-hibernate-reactive
-
-COPY pom.xml pom.xml
-COPY $MODULE/pom.xml $MODULE/pom.xml
-
-# Uncomment to test pre-release quarkus
-#RUN mkdir -p /root/.m2/repository/io
-#COPY m2-quarkus /root/.m2/repository/io/quarkus
-
-WORKDIR /quarkus/$MODULE
-RUN mvn dependency:go-offline -q
-WORKDIR /quarkus
-
-COPY $MODULE/src $MODULE/src
-
-WORKDIR /quarkus/$MODULE
-RUN mvn package -q
-WORKDIR /quarkus
-
-FROM openjdk:11.0.6-jdk-slim
-WORKDIR /quarkus
-ENV MODULE=reactive-routes-hibernate-reactive
-
-COPY --from=maven /quarkus/$MODULE/target/lib lib
-COPY --from=maven /quarkus/$MODULE/target/$MODULE-1.0-SNAPSHOT-runner.jar app.jar
-
-EXPOSE 8080
-
-CMD ["java", "-server", "-XX:-UseBiasedLocking", "-XX:+UseStringDeduplication", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.disableMetrics=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.flashPolicyHandler=false", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dhibernate.allow_update_outside_transaction=true", "-Djboss.threads.eqe.statistics=false", "-jar", "app.jar"]

+ 0 - 31
frameworks/Java/quarkus/quarkus-reactive-routes-pgclient.dockerfile

@@ -1,31 +0,0 @@
-FROM maven:3.6.3-jdk-11-slim as maven
-WORKDIR /quarkus
-ENV MODULE=reactive-routes-pgclient
-
-COPY pom.xml pom.xml
-COPY $MODULE/pom.xml $MODULE/pom.xml
-
-# Uncomment to test pre-release quarkus
-#RUN mkdir -p /root/.m2/repository/io
-#COPY m2-quarkus /root/.m2/repository/io/quarkus
-
-WORKDIR /quarkus/$MODULE
-RUN mvn dependency:go-offline -q
-WORKDIR /quarkus
-
-COPY $MODULE/src $MODULE/src
-
-WORKDIR /quarkus/$MODULE
-RUN mvn package -q
-WORKDIR /quarkus
-
-FROM openjdk:11.0.6-jdk-slim
-WORKDIR /quarkus
-ENV MODULE=reactive-routes-pgclient
-
-COPY --from=maven /quarkus/$MODULE/target/lib lib
-COPY --from=maven /quarkus/$MODULE/target/$MODULE-1.0-SNAPSHOT-runner.jar app.jar
-
-EXPOSE 8080
-
-CMD ["java", "-server", "-XX:-UseBiasedLocking", "-XX:+UseStringDeduplication", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.disableMetrics=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.flashPolicyHandler=false", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dhibernate.allow_update_outside_transaction=true", "-Djboss.threads.eqe.statistics=false", "-jar", "app.jar"]

+ 17 - 9
frameworks/Java/quarkus/quarkus-resteasy-reactive-hibernate-reactive.dockerfile

@@ -1,31 +1,39 @@
-FROM maven:3.6.3-jdk-11-slim as maven
+FROM docker.io/maven:3.8.4-eclipse-temurin-11 as maven
 WORKDIR /quarkus
 ENV MODULE=resteasy-reactive-hibernate-reactive
 
 COPY pom.xml pom.xml
-COPY $MODULE/pom.xml $MODULE/pom.xml
+COPY quarkus-benchmark-common quarkus-benchmark-common/
+COPY resteasy-hibernate resteasy-hibernate/
+COPY resteasy-reactive-hibernate resteasy-reactive-hibernate/
+COPY resteasy-reactive-hibernate-reactive resteasy-reactive-hibernate-reactive/
 
 # Uncomment to test pre-release quarkus
 #RUN mkdir -p /root/.m2/repository/io
 #COPY m2-quarkus /root/.m2/repository/io/quarkus
 
+WORKDIR /quarkus
+RUN mvn -DskipTests install -pl :benchmark,:quarkus-benchmark-common -B -q
+
 WORKDIR /quarkus/$MODULE
-RUN mvn dependency:go-offline -q
+RUN mvn dependency:go-offline -B -q
 WORKDIR /quarkus
 
 COPY $MODULE/src $MODULE/src
 
 WORKDIR /quarkus/$MODULE
-RUN mvn package -q
+RUN mvn package -B -q
 WORKDIR /quarkus
 
-FROM openjdk:11.0.6-jdk-slim
+FROM docker.io/eclipse-temurin:11-jdk
 WORKDIR /quarkus
 ENV MODULE=resteasy-reactive-hibernate-reactive
 
-COPY --from=maven /quarkus/$MODULE/target/lib lib
-COPY --from=maven /quarkus/$MODULE/target/$MODULE-1.0-SNAPSHOT-runner.jar app.jar
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/lib/ lib
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/app/ app
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/quarkus/ quarkus
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/quarkus-run.jar quarkus-run.jar
+COPY run_quarkus.sh run_quarkus.sh
 
 EXPOSE 8080
-
-CMD ["java", "-server", "-XX:-UseBiasedLocking", "-XX:+UseStringDeduplication", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.disableMetrics=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.flashPolicyHandler=false", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dhibernate.allow_update_outside_transaction=true", "-Djboss.threads.eqe.statistics=false", "-jar", "app.jar"]
+ENTRYPOINT "./run_quarkus.sh"

+ 17 - 9
frameworks/Java/quarkus/quarkus-resteasy-reactive-hibernate.dockerfile

@@ -1,31 +1,39 @@
-FROM maven:3.6.3-jdk-11-slim as maven
+FROM docker.io/maven:3.8.4-eclipse-temurin-11 as maven
 WORKDIR /quarkus
 ENV MODULE=resteasy-reactive-hibernate
 
 COPY pom.xml pom.xml
-COPY $MODULE/pom.xml $MODULE/pom.xml
+COPY quarkus-benchmark-common quarkus-benchmark-common/
+COPY resteasy-hibernate resteasy-hibernate/
+COPY resteasy-reactive-hibernate resteasy-reactive-hibernate/
+COPY resteasy-reactive-hibernate-reactive resteasy-reactive-hibernate-reactive/
 
 # Uncomment to test pre-release quarkus
 #RUN mkdir -p /root/.m2/repository/io
 #COPY m2-quarkus /root/.m2/repository/io/quarkus
 
+WORKDIR /quarkus
+RUN mvn -DskipTests install -pl :benchmark,:quarkus-benchmark-common -B -q
+
 WORKDIR /quarkus/$MODULE
-RUN mvn dependency:go-offline -q
+RUN mvn dependency:go-offline -B -q
 WORKDIR /quarkus
 
 COPY $MODULE/src $MODULE/src
 
 WORKDIR /quarkus/$MODULE
-RUN mvn package -q
+RUN mvn package -B -q
 WORKDIR /quarkus
 
-FROM openjdk:11.0.6-jdk-slim
+FROM docker.io/eclipse-temurin:11-jdk
 WORKDIR /quarkus
 ENV MODULE=resteasy-reactive-hibernate
 
-COPY --from=maven /quarkus/$MODULE/target/lib lib
-COPY --from=maven /quarkus/$MODULE/target/$MODULE-1.0-SNAPSHOT-runner.jar app.jar
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/lib/ lib
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/app/ app
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/quarkus/ quarkus
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/quarkus-run.jar quarkus-run.jar
+COPY run_quarkus.sh run_quarkus.sh
 
 EXPOSE 8080
-
-CMD ["java", "-server", "-XX:-UseBiasedLocking", "-XX:+UseStringDeduplication", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.disableMetrics=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.flashPolicyHandler=false", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dhibernate.allow_update_outside_transaction=true", "-Djboss.threads.eqe.statistics=false", "-jar", "app.jar"]
+ENTRYPOINT "./run_quarkus.sh"

+ 0 - 31
frameworks/Java/quarkus/quarkus-resteasy-reactive-pgclient.dockerfile

@@ -1,31 +0,0 @@
-FROM maven:3.6.3-jdk-11-slim as maven
-WORKDIR /quarkus
-ENV MODULE=resteasy-reactive-pgclient
-
-COPY pom.xml pom.xml
-COPY $MODULE/pom.xml $MODULE/pom.xml
-
-# Uncomment to test pre-release quarkus
-#RUN mkdir -p /root/.m2/repository/io
-#COPY m2-quarkus /root/.m2/repository/io/quarkus
-
-WORKDIR /quarkus/$MODULE
-RUN mvn dependency:go-offline -q
-WORKDIR /quarkus
-
-COPY $MODULE/src $MODULE/src
-
-WORKDIR /quarkus/$MODULE
-RUN mvn package -q
-WORKDIR /quarkus
-
-FROM openjdk:11.0.6-jdk-slim
-WORKDIR /quarkus
-ENV MODULE=resteasy-reactive-pgclient
-
-COPY --from=maven /quarkus/$MODULE/target/lib lib
-COPY --from=maven /quarkus/$MODULE/target/$MODULE-1.0-SNAPSHOT-runner.jar app.jar
-
-EXPOSE 8080
-
-CMD ["java", "-server", "-XX:-UseBiasedLocking", "-XX:+UseStringDeduplication", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.disableMetrics=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.flashPolicyHandler=false", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dhibernate.allow_update_outside_transaction=true", "-Djboss.threads.eqe.statistics=false", "-jar", "app.jar"]

+ 17 - 9
frameworks/Java/quarkus/quarkus.dockerfile

@@ -1,31 +1,39 @@
-FROM maven:3.6.3-jdk-11-slim as maven
+FROM docker.io/maven:3.8.4-eclipse-temurin-11 as maven
 WORKDIR /quarkus
 ENV MODULE=resteasy-hibernate
 
 COPY pom.xml pom.xml
-COPY $MODULE/pom.xml $MODULE/pom.xml
+COPY quarkus-benchmark-common quarkus-benchmark-common/
+COPY resteasy-hibernate resteasy-hibernate/
+COPY resteasy-reactive-hibernate resteasy-reactive-hibernate/
+COPY resteasy-reactive-hibernate-reactive resteasy-reactive-hibernate-reactive/
 
 # Uncomment to test pre-release quarkus
 #RUN mkdir -p /root/.m2/repository/io
 #COPY m2-quarkus /root/.m2/repository/io/quarkus
 
+WORKDIR /quarkus
+RUN mvn -DskipTests install -pl :benchmark,:quarkus-benchmark-common -B -q
+
 WORKDIR /quarkus/$MODULE
-RUN mvn dependency:go-offline -q
+RUN mvn dependency:go-offline -B -q
 WORKDIR /quarkus
 
 COPY $MODULE/src $MODULE/src
 
 WORKDIR /quarkus/$MODULE
-RUN mvn package -q
+RUN mvn package -B -q
 WORKDIR /quarkus
 
-FROM openjdk:11.0.6-jdk-slim
+FROM docker.io/eclipse-temurin:11-jdk
 WORKDIR /quarkus
 ENV MODULE=resteasy-hibernate
 
-COPY --from=maven /quarkus/$MODULE/target/lib lib
-COPY --from=maven /quarkus/$MODULE/target/$MODULE-1.0-SNAPSHOT-runner.jar app.jar
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/lib/ lib
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/app/ app
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/quarkus/ quarkus
+COPY --from=maven /quarkus/$MODULE/target/quarkus-app/quarkus-run.jar quarkus-run.jar
+COPY run_quarkus.sh run_quarkus.sh
 
 EXPOSE 8080
-
-CMD ["java", "-server", "-XX:-UseBiasedLocking", "-XX:+UseStringDeduplication", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.disableMetrics=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.flashPolicyHandler=false", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dhibernate.allow_update_outside_transaction=true", "-Djboss.threads.eqe.statistics=false", "-jar", "app.jar"]
+ENTRYPOINT "./run_quarkus.sh"

+ 0 - 46
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/pom.xml

@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project>
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>io.quarkus</groupId>
-        <artifactId>benchmark</artifactId>
-        <version>1.0-SNAPSHOT</version>
-        <relativePath>../</relativePath>
-    </parent>
-
-    <groupId>io.quarkus.benchmark</groupId>
-    <artifactId>reactive-routes-hibernate-reactive</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-reactive-pg-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-scheduler</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-hibernate-reactive</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-vertx-web</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.github.spullara.mustache.java</groupId>
-            <artifactId>compiler</artifactId>
-            <version>0.9.6</version>
-        </dependency>
-        <dependency>
-            <groupId>io.vertx</groupId>
-            <artifactId>vertx-pg-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.vertx</groupId>
-            <artifactId>vertx-sql-client</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 0 - 28
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java

@@ -1,28 +0,0 @@
-package io.quarkus.benchmark.filter;
-
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-
-import javax.inject.Singleton;
-
-import io.quarkus.scheduler.Scheduled;
-import io.quarkus.vertx.web.RouteFilter;
-import io.vertx.ext.web.RoutingContext;
-
-@Singleton
-public class ServerHeaderFilter {
-
-    private String date;
-
-    @Scheduled(every="1s")
-    void increment() {
-        date = DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now());
-    }
-
-    @RouteFilter(100) 
-    void myFilter(RoutingContext rc) {
-       rc.response().putHeader( "Server", "Quarkus");
-       rc.response().putHeader( "Date", date);
-       rc.next(); 
-    }
-}

+ 0 - 56
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/model/Fortune.java

@@ -1,56 +0,0 @@
-package io.quarkus.benchmark.model;
-
-import org.hibernate.annotations.Immutable;
-
-import java.util.Objects;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-@Entity
-@Immutable
-public class Fortune {
-
-    @Id
-    private int id;
-    private String message;
-
-    public Fortune() {}
-
-    public Fortune(int id, String message) {
-        this.id = id;
-        this.message = message;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o)
-            return true;
-        if (o == null || getClass() != o.getClass())
-            return false;
-        Fortune fortune = (Fortune) o;
-        return id == fortune.id &&
-                Objects.equals(message, fortune.message);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id, message);
-    }
-}

+ 0 - 29
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/model/World.java

@@ -1,29 +0,0 @@
-package io.quarkus.benchmark.model;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-@Entity
-public class World {
-
-    @Id
-    private int id;
-    private int randomNumber;
-
-    public int getId() {
-        return id;
-    }
-
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    public int getRandomNumber() {
-        return randomNumber;
-    }
-
-    public void setRandomNumber(int randomNumber) {
-        this.randomNumber = randomNumber;
-    }
-
-}

+ 0 - 19
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/BaseRepository.java

@@ -1,19 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import java.util.function.Function;
-
-import javax.inject.Inject;
-
-import org.hibernate.reactive.mutiny.Mutiny;
-
-import io.smallrye.mutiny.Uni;
-
-public class BaseRepository {
-    @Inject
-    protected Mutiny.SessionFactory sf;
-
-    public <T> Uni<T> inSession(Function<Mutiny.Session, Uni<T>> work){
-        return sf.withSession(session -> work.apply(session));
-    }
-
-}

+ 0 - 25
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java

@@ -1,25 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import java.util.List;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
-
-import io.quarkus.benchmark.model.Fortune;
-import io.smallrye.mutiny.Uni;
-
-@ApplicationScoped
-public class FortuneRepository extends BaseRepository {
-
-    public Uni<List<Fortune>> findAll() {
-        return inSession(s -> {
-            CriteriaBuilder criteriaBuilder = sf.getCriteriaBuilder();
-            CriteriaQuery<Fortune> fortuneQuery = criteriaBuilder.createQuery(Fortune.class);
-            Root<Fortune> from = fortuneQuery.from(Fortune.class);
-            fortuneQuery.select(from);
-            return s.createQuery(fortuneQuery).getResultList();
-        });
-    }
-}

+ 0 - 65
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java

@@ -1,65 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ThreadLocalRandom;
-
-import javax.inject.Singleton;
-
-import org.hibernate.reactive.mutiny.Mutiny;
-import org.hibernate.reactive.mutiny.Mutiny.Session;
-
-import io.quarkus.benchmark.model.World;
-import io.smallrye.mutiny.Uni;
-
-
-@Singleton
-public class WorldRepository extends BaseRepository {
-
-    /**
-     * This method is not required (nor specified) by the benchmark rules,
-     * but is quite handy to seed a local database and be able to experiment
-     * with the app locally.
-     */
-    public Uni<Void> createData() {
-        return inSession(s -> {
-            final ThreadLocalRandom random = ThreadLocalRandom.current();
-            int MAX = 10000;
-            Uni<Void>[] unis = new Uni[MAX];
-            for (int i=0; i<MAX; i++) {
-                final World world = new World();
-                world.setId(i + 1);
-                world.setRandomNumber(1 + random.nextInt(10000));
-                unis[i] = s.persist(world).map(v -> null);
-            }
-            return Uni.combine().all().unis(unis).combinedWith(l -> null)
-                    .flatMap(v -> s.flush())
-                    .map(v -> null);
-        });
-    }
-
-    public Uni<World> find(int id) {
-        return inSession(session -> singleFind(session, id));
-    }
-
-    public Uni<Collection<World>> update(Mutiny.Session s, Collection<World> worlds) {
-        return s.flush()
-                .map(v -> worlds);
-            }
-
-    public Uni<Collection<World>> find(Session s, Set<Integer> ids) {
-        //The rules require individual load: we can't use the Hibernate feature which allows load by multiple IDs as one single operation
-        ArrayList<Uni<World>> l = new ArrayList<>(ids.size());
-        for (Integer id : ids) {
-            l.add(singleFind(s, id));
-        }
-        return Uni.combine().all().unis(l).combinedWith(list -> (List<World>)list);
-    }
-
-    private static Uni<World> singleFind(final Mutiny.Session ss, final Integer id) {
-        return ss.find(World.class, id);
-    }
-
-}

+ 0 - 34
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/BaseResource.java

@@ -1,34 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-import javax.inject.Inject;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import io.vertx.ext.web.RoutingContext;
-
-public abstract class BaseResource {
-    
-    @Inject
-    ObjectMapper mapper;
-
-    void sendJson(RoutingContext rc, Object value) {
-        try {
-            rc.response().putHeader("Content-Type", "application/json");
-            rc.response().end(mapper.writeValueAsString(value));
-        } catch (JsonProcessingException e) {
-            throw new RuntimeException(e);
-        }   
-    }
-
-    Void handleFail(RoutingContext rc, Throwable t) {
-        var sw = new StringWriter();
-        t.printStackTrace(new PrintWriter(sw));
-        rc.response().setStatusCode(500).end(sw.toString());
-        return null;
-    }
-
-}

+ 0 - 130
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/DbResource.java

@@ -1,130 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.ThreadLocalRandom;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-
-import org.hibernate.FlushMode;
-import org.hibernate.reactive.mutiny.Mutiny;
-
-import io.quarkus.benchmark.model.World;
-import io.quarkus.benchmark.repository.WorldRepository;
-import io.quarkus.vertx.web.Route;
-import io.smallrye.mutiny.Uni;
-import io.vertx.ext.web.RoutingContext;
-
-
-@ApplicationScoped
-public class DbResource extends BaseResource {
-
-    @Inject
-    WorldRepository worldRepository;
-
-    @Route(path = "db")
-    public void db(RoutingContext rc) {
-        randomWorld().subscribe().with(world -> sendJson(rc, world),
-                                       t -> handleFail(rc, t));
-    }
-
-    @Route(path = "queries")
-    public void queries(RoutingContext rc) {
-        var queries = rc.request().getParam("queries");
-        worldRepository.inSession(session -> randomWorldForRead(session, parseQueryCount(queries)))
-        .subscribe().with(list -> sendJson(rc, list),
-                          t -> handleFail(rc, t));
-    }
-
-    //Rules: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates
-    //N.B. the benchmark seems to be designed to get in deadlocks when using a "safe pattern" of updating
-    // the entity within the same transaction as the one which read it.
-    // We therefore need to do a "read then write" while relinquishing the transaction between the two operations, as
-    // all other tested frameworks seem to do.
-    @Route(path = "updates")
-    public void updates(RoutingContext rc) {
-        var queries = rc.request().getParam("queries");
-        worldRepository.inSession(session -> {
-            // FIXME: not supported
-            //          session.setJdbcBatchSize(worlds.size());
-            session.setFlushMode(FlushMode.MANUAL);
-
-            var worlds = randomWorldForRead(session, parseQueryCount(queries));
-            return worlds.flatMap(worldsCollection -> {
-                worldsCollection.forEach( w -> {
-                    //Read the one field, as required by the following rule:
-                    // # vi. At least the randomNumber field must be read from the database result set.
-                    final int previousRead = w.getRandomNumber();
-                    //Update it, but make sure to exclude the current number as Hibernate optimisations would have us "fail"
-                    //the verification:
-                    w.setRandomNumber(randomWorldNumber(previousRead));
-                } );
-                
-                return worldRepository.update(session, worldsCollection);
-            });
-        }).subscribe().with(list -> sendJson(rc, list),
-                            t -> handleFail(rc, t));
-    }
-
-    private Uni<Collection<World>> randomWorldForRead(Mutiny.Session session, int count) {
-        Set<Integer> ids = new HashSet<>(count);
-        int counter = 0;
-        while (counter < count) {
-            counter += ids.add(Integer.valueOf(randomWorldNumber())) ? 1 : 0;
-        }
-        return worldRepository.find(session, ids);
-    }
-
-    @Route(path = "createdata")
-    public void createData(RoutingContext rc) {
-        worldRepository.createData().subscribe().with(v -> rc.response().end("Data created"),
-                                                      t -> handleFail(rc, t));
-    }
-
-    private Uni<World> randomWorld() {
-        int i = randomWorldNumber();
-        return worldRepository.find(i);
-    }
-
-    private int randomWorldNumber() {
-        return 1 + ThreadLocalRandom.current().nextInt(10000);
-    }
-
-    /**
-     * Also according to benchmark requirements, except that in this special case
-     * of the update test we need to ensure we'll actually generate an update operation:
-     * for this we need to generate a random number between 1 to 10000, but different
-     * from the current field value.
-     * @param previousRead
-     * @return
-     */
-    private int randomWorldNumber(final int previousRead) {
-        //conceptually split the random space in those before previousRead,
-        //and those after: this approach makes sure to not affect the random characteristics.
-        final int trueRandom = ThreadLocalRandom.current().nextInt(9999) + 2;
-        if (trueRandom<=previousRead) {
-            //all figures equal or before the current field read need to be shifted back by one
-            //so to avoid hitting the same number while not affecting the distribution.
-            return trueRandom - 1;
-        }
-        else {
-            //Those after are generated by taking the generated value 2...10000 as is.
-            return trueRandom;
-        }
-    }
-
-    private int parseQueryCount(String textValue) {
-        if (textValue == null) {
-            return 1;
-        }
-        int parsedValue;
-        try {
-            parsedValue = Integer.parseInt(textValue);
-        } catch (NumberFormatException e) {
-            return 1;
-        }
-        return Math.min(500, Math.max(1, parsedValue));
-    }
-}

+ 0 - 47
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java

@@ -1,47 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import java.io.StringWriter;
-import java.util.Collections;
-import java.util.Comparator;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-
-import com.github.mustachejava.DefaultMustacheFactory;
-import com.github.mustachejava.Mustache;
-import com.github.mustachejava.MustacheFactory;
-
-import io.quarkus.benchmark.model.Fortune;
-import io.quarkus.benchmark.repository.FortuneRepository;
-import io.quarkus.vertx.web.Route;
-import io.vertx.ext.web.RoutingContext;
-
-@ApplicationScoped
-public class FortuneResource extends BaseResource {
-
-    @Inject
-    FortuneRepository repository;
-
-    private final Mustache template;
-    private Comparator<Fortune> fortuneComparator;
-
-    public FortuneResource() {
-        MustacheFactory mf = new DefaultMustacheFactory();
-        template = mf.compile("fortunes.mustache");
-        fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
-    }
-
-    @Route(path = "fortunes")
-    public void fortunes(RoutingContext rc) {
-        repository.findAll()
-        .subscribe().with( fortunes -> {
-            fortunes.add(new Fortune(0, "Additional fortune added at request time."));
-            fortunes.sort(fortuneComparator);
-            StringWriter writer = new StringWriter();
-            template.execute(writer, Collections.singletonMap("fortunes", fortunes));
-            rc.response().putHeader("Content-Type", "text/html;charset=UTF-8");
-            rc.response().end(writer.toString());
-        },
-                           t -> handleFail(rc, t));
-    }
-}

+ 0 - 21
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/JsonResource.java

@@ -1,21 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import java.util.Collections;
-
-import javax.enterprise.context.ApplicationScoped;
-
-import io.quarkus.vertx.web.Route;
-import io.vertx.ext.web.RoutingContext;
-
-@ApplicationScoped
-public class JsonResource extends BaseResource {
-
-    private static final String MESSAGE = "message";
-    private static final String HELLO = "Hello, World!";
-
-    @Route(path = "json")
-    public void json(RoutingContext rc) {
-        sendJson(rc, Collections.singletonMap( MESSAGE, HELLO ));
-    }
-}
-

+ 0 - 17
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java

@@ -1,17 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import javax.enterprise.context.ApplicationScoped;
-
-import io.quarkus.vertx.web.Route;
-import io.vertx.ext.web.RoutingContext;
-
-@ApplicationScoped
-public class PlaintextResource {
-    private static final String HELLO = "Hello, World!";
-
-    @Route(path = "plaintext")
-    public void plaintext(RoutingContext rc) {
-        rc.response().putHeader("Content-Type", "text/plain");
-        rc.response().end(HELLO);
-    }
-}

+ 0 - 20
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/resources/application.properties

@@ -1,20 +0,0 @@
-quarkus.datasource.db-kind=postgresql
-quarkus.datasource.username=benchmarkdbuser
-quarkus.datasource.password=benchmarkdbpass
-#quarkus.datasource.max-size=64
-
-# Reactive config
-quarkus.datasource.reactive=true
-quarkus.datasource.reactive.url=postgresql://tfb-database:5432/hello_world
-%dev.quarkus.datasource.reactive.url=postgresql://localhost:5432/hello_world
-
-quarkus.datasource.reactive.thread-local=true
-quarkus.datasource.reactive.cache-prepared-statements=true
-quarkus.datasource.reactive.max-size=4
-
-#quarkus.vertx.storage=false
-
-quarkus.log.console.enable=true
-quarkus.log.console.level=INFO
-quarkus.log.file.enable=false
-quarkus.log.level=INFO

+ 0 - 20
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/src/main/resources/fortunes.mustache

@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Fortunes</title>
-</head>
-<body>
-<table>
-    <tr>
-        <th>id</th>
-        <th>message</th>
-    </tr>
-    {{#fortunes}}
-        <tr>
-            <td>{{id}}</td>
-            <td>{{message}}</td>
-        </tr>
-    {{/fortunes}}
-</table>
-</body>
-</html>

+ 0 - 2
frameworks/Java/quarkus/reactive-routes-hibernate-reactive/start-app.sh

@@ -1,2 +0,0 @@
-java -XX:+FlightRecorder -XX:+UseParallelGC -Dquarkus.datasource.url=vertx-reactive:postgresql://localhost:5432/hello_world -Dquarkus.http.host=127.0.0.1 -Djava.lang.Integer.IntegerCache.high=10000 -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true -Dhibernate.allow_update_outside_transaction=true -Djboss.threads.eqe.statistics=false -jar target/pgclient-1.0-SNAPSHOT-runner.jar
-

+ 0 - 43
frameworks/Java/quarkus/reactive-routes-pgclient/pom.xml

@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project>
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>io.quarkus</groupId>
-        <artifactId>benchmark</artifactId>
-        <version>1.0-SNAPSHOT</version>
-        <relativePath>../</relativePath>
-    </parent>
-
-    <groupId>io.quarkus.benchmark</groupId>
-    <artifactId>reactive-routes-pgclient</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-scheduler</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-reactive-pg-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-vertx-web</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.vertx</groupId>
-            <artifactId>vertx-web-templ-rocker</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-transport-native-epoll</artifactId>
-            <classifier>linux-x86_64</classifier>
-        </dependency>
-        <dependency>
-            <groupId>com.github.spullara.mustache.java</groupId>
-            <artifactId>compiler</artifactId>
-            <version>0.9.6</version>
-        </dependency>
-    </dependencies>
-</project>

+ 0 - 33
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java

@@ -1,33 +0,0 @@
-package io.quarkus.benchmark.filter;
-
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-
-import javax.inject.Singleton;
-
-import io.quarkus.scheduler.Scheduled;
-import io.quarkus.vertx.web.RouteFilter;
-import io.vertx.core.http.HttpHeaders;
-import io.vertx.ext.web.RoutingContext;
-
-@Singleton
-public class ServerHeaderFilter {
-
-    private static final CharSequence SERVER_HEADER_NAME = HttpHeaders.createOptimized("Server");
-    private static final CharSequence SERVER_HEADER_VALUE = HttpHeaders.createOptimized("Quarkus");
-    private static final CharSequence DATE_HEADER_NAME = HttpHeaders.createOptimized("Date");
-
-    private CharSequence date;
-
-    @Scheduled(every="1s")
-    void increment() {
-        date = HttpHeaders.createOptimized(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()));
-    }
-
-    @RouteFilter(100) 
-    void myFilter(RoutingContext rc) {
-       rc.response().putHeader( SERVER_HEADER_NAME, SERVER_HEADER_VALUE);
-       rc.response().putHeader( DATE_HEADER_NAME, date);
-       rc.next(); 
-    }
-}

+ 0 - 48
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/Fortune.java

@@ -1,48 +0,0 @@
-package io.quarkus.benchmark.model;
-
-import java.util.Objects;
-
-public class Fortune {
-
-    private int id;
-    private String message;
-
-    public Fortune() {}
-
-    public Fortune(int id, String message) {
-        this.id = id;
-        this.message = message;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o)
-            return true;
-        if (o == null || getClass() != o.getClass())
-            return false;
-        Fortune fortune = (Fortune) o;
-        return id == fortune.id &&
-                Objects.equals(message, fortune.message);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id, message);
-    }
-}

+ 0 - 35
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/World.java

@@ -1,35 +0,0 @@
-package io.quarkus.benchmark.model;
-
-public class World implements Comparable<World>{
-
-    private int id;
-    private int randomNumber;
-
-    public World() {}
-
-    public World(int id, int randomNumber) {
-        this.id = id;
-        this.randomNumber = randomNumber;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    public int getRandomNumber() {
-        return randomNumber;
-    }
-
-    public void setRandomNumber(int randomNumber) {
-        this.randomNumber = randomNumber;
-    }
-
-    @Override
-    public int compareTo(World o) {
-        return Integer.compare(id, o.id);
-    }
-}

+ 0 - 30
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java

@@ -1,30 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-
-import io.quarkus.benchmark.model.Fortune;
-import io.smallrye.mutiny.Uni;
-import io.vertx.mutiny.sqlclient.Row;
-
-@ApplicationScoped
-public class FortuneRepository {
-
-    @Inject
-    PgClients clients;
-
-    public Uni<List<Fortune>> findAll() {
-        return clients.getClient().preparedQuery("SELECT * FROM Fortune" )
-                .execute()
-                .map(rowset -> {
-                    List<Fortune> ret = new ArrayList<>(rowset.size()+1);
-                    for(Row r : rowset) {
-                        ret.add(new Fortune(r.getInteger("id"), r.getString("message")));
-                    }
-                    return ret;
-                });
-    }
-}

+ 0 - 56
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java

@@ -1,56 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.Produces;
-import javax.inject.Inject;
-
-import org.eclipse.microprofile.config.inject.ConfigProperty;
-
-import io.vertx.mutiny.core.Vertx;
-import io.vertx.mutiny.pgclient.PgPool;
-import io.vertx.pgclient.PgConnectOptions;
-import io.vertx.sqlclient.PoolOptions;
-
-@ApplicationScoped
-public class PgClientFactory {
-
-    // vertx-reactive:postgresql://tfb-database:5432/hello_world
-    private static final String PG_URI_MATCHER = "vertx-reactive:postgresql://([-a-zA-Z]+):([0-9]+)/(.*)";
-
-    @ConfigProperty(name = "quarkus.datasource.url")
-	String url;
-
-	@ConfigProperty(name = "quarkus.datasource.username")
-	String user;
-
-	@ConfigProperty(name = "quarkus.datasource.password")
-	String pass;
-
-	@Inject
-	Vertx vertx;
-
-	@Produces
-	@ApplicationScoped
-	public PgClients pgClients() {
-	    return new PgClients(this);
-	}
-
-
-	PgPool sqlClient(int size) {
-		PoolOptions options = new PoolOptions();
-		PgConnectOptions connectOptions = new PgConnectOptions();
-		Matcher matcher = Pattern.compile(PG_URI_MATCHER).matcher(url);
-		matcher.matches();
-		connectOptions.setDatabase(matcher.group(3));
-		connectOptions.setHost(matcher.group(1));
-		connectOptions.setPort(Integer.parseInt(matcher.group(2)));
-		connectOptions.setUser(user);
-		connectOptions.setPassword(pass);
-		connectOptions.setCachePreparedStatements(true);
-		options.setMaxSize(size);
-		return PgPool.pool(vertx, connectOptions, options);
-	}
-}

+ 0 - 38
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClients.java

@@ -1,38 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import io.vertx.mutiny.pgclient.PgPool;
-import io.vertx.mutiny.sqlclient.SqlClient;
-
-class PgClients {
-    private static final int POOL_SIZE = 4;
-
-    private ThreadLocal<SqlClient> sqlClient = new ThreadLocal<>();
-    private ThreadLocal<PgPool> pool = new ThreadLocal<>();
-    private PgClientFactory pgClientFactory;
-
-	// for ArC
-	public PgClients() {
-	}
-
-	public PgClients(PgClientFactory pgClientFactory) {
-	    this.pgClientFactory = pgClientFactory;
-    }
-
-    SqlClient getClient() {
-        SqlClient ret = sqlClient.get();
-        if(ret == null) {
-            ret = pgClientFactory.sqlClient(1);
-            sqlClient.set(ret);
-        }
-		return ret;
-	}
-
-	synchronized PgPool getPool() {
-        PgPool ret = pool.get();
-        if(ret == null) {
-            ret = pgClientFactory.sqlClient(POOL_SIZE);
-            pool.set(ret);
-        }
-        return ret;
-	}
-}

+ 0 - 40
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java

@@ -1,40 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-
-import io.quarkus.benchmark.model.World;
-import io.smallrye.mutiny.Uni;
-import io.vertx.mutiny.sqlclient.Row;
-import io.vertx.mutiny.sqlclient.Tuple;
-
-@ApplicationScoped
-public class WorldRepository {
-
-    @Inject
-    PgClients clients;
-
-    public Uni<World> find(int id) {
-        return clients.getClient().preparedQuery("SELECT id, randomNumber FROM World WHERE id = $1")
-                .execute(Tuple.of(id))
-                .map(rowset -> {
-                    Row row = rowset.iterator().next();
-                    return new World(row.getInteger(0), row.getInteger(1));
-                });
-    }
-
-    public Uni<Void> update(World[] worlds) {
-        Arrays.sort(worlds);
-        List<Tuple> args = new ArrayList<>(worlds.length);
-        for (World world : worlds) {
-            args.add(Tuple.of(world.getId(), world.getRandomNumber()));
-        }
-        return clients.getPool().preparedQuery("UPDATE World SET randomNumber = $2 WHERE id = $1")
-                .executeBatch(args)
-                .map(v -> null);
-    }
-}

+ 0 - 20
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/BaseResource.java

@@ -1,20 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import io.vertx.core.http.HttpHeaders;
-import io.vertx.core.json.Json;
-import io.vertx.ext.web.RoutingContext;
-
-public abstract class BaseResource {
-
-    void sendJson(RoutingContext rc, Object value) {
-        rc.response()
-                .putHeader(HttpHeaders.CONTENT_TYPE, "application/json")
-                .end(Json.encodeToBuffer(value));
-    }
-
-    Void handleFail(RoutingContext rc, Throwable t) {
-        rc.response().setStatusCode(500).end(t.toString());
-        return null;
-    }
-
-}

+ 0 - 85
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java

@@ -1,85 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import java.util.Arrays;
-import java.util.concurrent.ThreadLocalRandom;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-
-import io.quarkus.benchmark.model.World;
-import io.quarkus.benchmark.repository.WorldRepository;
-import io.quarkus.vertx.web.Route;
-import io.smallrye.mutiny.Uni;
-import io.smallrye.mutiny.groups.UniAndGroupIterable;
-import io.vertx.ext.web.RoutingContext;
-
-
-@ApplicationScoped
-public class DbResource extends BaseResource {
-
-    @Inject
-    WorldRepository worldRepository;
-
-    @Route(path = "db")
-    public void db(RoutingContext rc) {
-        randomWorld().subscribe().with(world -> sendJson(rc, world),
-                                       t -> handleFail(rc, t));
-    }
-
-    @Route(path = "queries")
-    public void queries(RoutingContext rc) {
-        var queries = rc.request().getParam("queries");
-        var worlds = new Uni[parseQueryCount(queries)];
-        var ret = new World[worlds.length];
-        Arrays.setAll(worlds, i -> {
-            return randomWorld().map(w -> ret[i] = w);
-        });
-
-        Uni.combine().all().unis(worlds)
-        .combinedWith(v -> Arrays.asList(ret))
-        .subscribe().with(list -> sendJson(rc, list),
-                          t -> handleFail(rc, t));
-    }
-
-    @Route(path = "updates")
-    public void updates(RoutingContext rc) {
-        var queries = rc.request().getParam("queries");
-        var worlds = new Uni[parseQueryCount(queries)];
-        var ret = new World[worlds.length];
-        Arrays.setAll(worlds, i -> {
-            return randomWorld().map(w -> {
-                w.setRandomNumber(randomWorldNumber());
-                ret[i] = w;
-                return w;
-            });
-        });
-
-        Uni.combine().all().unis(worlds)
-        .combinedWith(v -> null)
-        .flatMap(v -> worldRepository.update(ret))
-        .map(v -> Arrays.asList(ret))
-        .subscribe().with(list -> sendJson(rc, list),
-                          t -> handleFail(rc, t));
-    }
-
-    private Uni<World> randomWorld() {
-        return worldRepository.find(randomWorldNumber());
-    }
-
-    private int randomWorldNumber() {
-        return 1 + ThreadLocalRandom.current().nextInt(10000);
-    }
-
-    private int parseQueryCount(String textValue) {
-        if (textValue == null) {
-            return 1;
-        }
-        int parsedValue;
-        try {
-            parsedValue = Integer.parseInt(textValue);
-        } catch (NumberFormatException e) {
-            return 1;
-        }
-        return Math.min(500, Math.max(1, parsedValue));
-    }
-}

+ 0 - 49
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java

@@ -1,49 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import java.io.StringWriter;
-import java.util.Collections;
-import java.util.Comparator;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-
-import com.github.mustachejava.DefaultMustacheFactory;
-import com.github.mustachejava.Mustache;
-import com.github.mustachejava.MustacheFactory;
-
-import io.quarkus.benchmark.model.Fortune;
-import io.quarkus.benchmark.repository.FortuneRepository;
-import io.quarkus.vertx.web.Route;
-import io.vertx.core.http.HttpHeaders;
-import io.vertx.ext.web.RoutingContext;
-
-@ApplicationScoped
-public class FortuneResource extends BaseResource {
-
-    @Inject
-    FortuneRepository repository;
-    private Mustache template;
-    private Comparator<Fortune> fortuneComparator;
-
-
-    public FortuneResource() {
-        MustacheFactory mf = new DefaultMustacheFactory();
-        template = mf.compile("fortunes.mustache");
-        fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
-    }
-
-    @Route(path = "fortunes")
-    public void fortunes(RoutingContext rc) {
-        repository.findAll()
-                .subscribe().with(fortunes -> {
-                    fortunes.add(new Fortune(0, "Additional fortune added at request time."));
-                    fortunes.sort(fortuneComparator);
-                    StringWriter writer = new StringWriter();
-                    template.execute(writer, Collections.singletonMap("fortunes", fortunes));
-                    rc.response()
-                    .putHeader(HttpHeaders.CONTENT_TYPE, "text/html; charset=UTF-8")
-                    .end(writer.toString());
-                },
-                t -> handleFail(rc, t));
-    }
-}

+ 0 - 18
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonResource.java

@@ -1,18 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import javax.enterprise.context.ApplicationScoped;
-
-import io.quarkus.vertx.web.Route;
-import io.vertx.ext.web.RoutingContext;
-
-@ApplicationScoped
-public class JsonResource extends BaseResource {
-
-    private static final String HELLO = "Hello, World!";
-
-    @Route(path = "json")
-    public void json(RoutingContext rc) {
-        sendJson(rc, new Message(HELLO));
-    }
-}
-

+ 0 - 13
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/Message.java

@@ -1,13 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-public class Message {
-  private final String message;
-
-  public Message(String message) {
-    this.message = message;
-  }
-
-  public String getMessage() {
-    return message;
-  }
-}

+ 0 - 23
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java

@@ -1,23 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import javax.enterprise.context.ApplicationScoped;
-
-import io.quarkus.vertx.web.Route;
-import io.vertx.core.buffer.Buffer;
-import io.vertx.core.http.HttpHeaders;
-import io.vertx.ext.web.RoutingContext;
-
-@ApplicationScoped
-public class PlaintextResource {
-    private static final String HELLO_WORLD = "Hello, world!";
-    private static final Buffer HELLO_WORLD_BUFFER = Buffer.factory.directBuffer(HELLO_WORLD, "UTF-8");
-
-    private static final CharSequence CONTENT_TYPE_HEADER_NAME = HttpHeaders.createOptimized("Content-Type");
-    private static final CharSequence CONTENT_TYPE_HEADER_VALUE = HttpHeaders.createOptimized("text/plain");
-
-    @Route(path = "plaintext")
-    public void plaintext(RoutingContext rc) {
-        rc.response().putHeader(CONTENT_TYPE_HEADER_NAME, CONTENT_TYPE_HEADER_VALUE);
-        rc.response().end(HELLO_WORLD_BUFFER);
-    }
-}

+ 0 - 9
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/application.properties

@@ -1,9 +0,0 @@
-quarkus.datasource.url=vertx-reactive:postgresql://tfb-database:5432/hello_world
-quarkus.datasource.username=benchmarkdbuser
-quarkus.datasource.password=benchmarkdbpass
-quarkus.datasource.reactive.max-size=64
-quarkus.log.console.enable=true
-quarkus.log.console.level=INFO
-quarkus.log.file.enable=false
-quarkus.log.level=INFO
-quarkus.vertx.prefer-native-transport=true

+ 0 - 20
frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/fortunes.mustache

@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Fortunes</title>
-</head>
-<body>
-<table>
-    <tr>
-        <th>id</th>
-        <th>message</th>
-    </tr>
-    {{#fortunes}}
-        <tr>
-            <td>{{id}}</td>
-            <td>{{message}}</td>
-        </tr>
-    {{/fortunes}}
-</table>
-</body>
-</html>

+ 0 - 2
frameworks/Java/quarkus/reactive-routes-pgclient/start-app.sh

@@ -1,2 +0,0 @@
-java -XX:+FlightRecorder -XX:+UseParallelGC -Dquarkus.datasource.url=vertx-reactive:postgresql://localhost:5432/hello_world -Dquarkus.http.host=127.0.0.1 -Djava.lang.Integer.IntegerCache.high=10000 -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true -Dhibernate.allow_update_outside_transaction=true -Djboss.threads.eqe.statistics=false -jar target/pgclient-1.0-SNAPSHOT-runner.jar
-

+ 35 - 5
frameworks/Java/quarkus/resteasy-hibernate/pom.xml

@@ -6,13 +6,16 @@
         <groupId>io.quarkus</groupId>
         <artifactId>benchmark</artifactId>
         <version>1.0-SNAPSHOT</version>
-        <relativePath>../</relativePath>
     </parent>
 
     <groupId>io.quarkus.benchmark</groupId>
     <artifactId>resteasy-hibernate</artifactId>
 
     <dependencies>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-benchmark-common</artifactId>
+        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-hibernate-orm</artifactId>
@@ -34,11 +37,38 @@
             <artifactId>quarkus-jdbc-postgresql</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.github.spullara.mustache.java</groupId>
-            <artifactId>compiler</artifactId>
-            <version>0.9.6</version>
+            <groupId>com.fizzed</groupId>
+            <artifactId>rocker-compiler</artifactId>
+            <version>1.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport-native-epoll</artifactId>
+            <classifier>linux-x86_64</classifier>
         </dependency>
-
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.fizzed</groupId>
+                <artifactId>rocker-maven-plugin</artifactId>
+                <version>1.3.0</version>
+                <executions>
+                    <execution>
+                        <id>generate-rocker-templates</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <configuration>
+                            <templateDirectory>${project.basedir}/src/main/resources</templateDirectory>
+                            <optimize>true</optimize>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+
+    </build>
 </project>

+ 7 - 1
frameworks/Java/quarkus/resteasy-hibernate/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java

@@ -3,6 +3,7 @@ package io.quarkus.benchmark.filter;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 
+import javax.annotation.PostConstruct;
 import javax.inject.Singleton;
 import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.container.ContainerResponseContext;
@@ -16,7 +17,12 @@ import io.quarkus.scheduler.Scheduled;
 @Provider
 public class ServerHeaderFilter implements ContainerResponseFilter {
 
-    private String date;
+    private volatile String date;
+
+    @PostConstruct
+    public void init() {
+        date = DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now());
+    }
 
     @Scheduled(every="1s")
     void increment() {

+ 17 - 24
frameworks/Java/quarkus/resteasy-hibernate/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java

@@ -1,10 +1,10 @@
 package io.quarkus.benchmark.resource;
 
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
+import com.fizzed.rocker.BindableRockerModel;
+import com.fizzed.rocker.Rocker;
+import com.fizzed.rocker.RockerOutput;
+import io.quarkus.benchmark.model.Fortune;
+import io.quarkus.benchmark.repository.FortuneRepository;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -13,31 +13,23 @@ import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
-
-import com.github.mustachejava.DefaultMustacheFactory;
-import com.github.mustachejava.Mustache;
-import com.github.mustachejava.MustacheFactory;
-
-import io.quarkus.benchmark.model.Fortune;
-import io.quarkus.benchmark.repository.FortuneRepository;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 
 @Singleton
 @Path("/")
-@Produces(MediaType.TEXT_HTML+"; charset=UTF-8")
+@Produces(MediaType.TEXT_HTML + "; charset=UTF-8")
 @Consumes(MediaType.APPLICATION_JSON)
 public class FortuneResource {
 
     @Inject
     FortuneRepository repository;
 
-    private final Mustache template;
-    private final Comparator<Fortune> fortuneComparator;
-
-    public FortuneResource() {
-        MustacheFactory mf = new DefaultMustacheFactory();
-        template = mf.compile("fortunes.mustache");
-        fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
-    }
+    private static final String FORTUNES_MAP_KEY = "fortunes";
+    private static final String FORTUNES_TEMPLATE_FILENAME = "Fortunes.rocker.html";
+    private static final Comparator<Fortune> fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
 
     @GET
     @Path("/fortunes")
@@ -46,9 +38,10 @@ public class FortuneResource {
         fortunes.add(new Fortune(0, "Additional fortune added at request time."));
         fortunes.sort(fortuneComparator);
 
-        StringWriter writer = new StringWriter();
-        template.execute(writer, Collections.singletonMap("fortunes", fortunes));
+        RockerOutput output = Rocker.template(FORTUNES_TEMPLATE_FILENAME)
+                .bind(Collections.singletonMap(FORTUNES_MAP_KEY, fortunes))
+                .render();
 
-        return writer.toString();
+        return output.toString();
     }
 }

+ 21 - 0
frameworks/Java/quarkus/resteasy-hibernate/src/main/resources/Fortunes.rocker.html

@@ -0,0 +1,21 @@
+@import java.util.*
+@import io.quarkus.benchmark.model.*
+@args(List fortunes)
+<!DOCTYPE html>
+<html>
+<head><title>Fortunes</title></head>
+<body>
+<table>
+    <tr>
+        <th>id</th>
+        <th>message</th>
+    </tr>
+    @for ((ForIterator i, Fortune fortune) : fortunes) {
+    <tr>
+        <td>@fortune.getId()</td>
+        <td>@fortune.getMessage()</td>
+    </tr>
+    }
+</table>
+</body>
+</html>

+ 9 - 2
frameworks/Java/quarkus/resteasy-hibernate/src/main/resources/application.properties

@@ -8,9 +8,9 @@ quarkus.datasource.jdbc.url=jdbc:postgresql://tfb-database:5432/hello_world?logg
 quarkus.datasource.jdbc.driver=org.postgresql.Driver
 quarkus.datasource.jdbc.transactions=disabled
 quarkus.datasource.jdbc.detect-statement-leaks=false
-quarkus.datasource.jdbc.max-size=64
+quarkus.datasource.jdbc.max-size=512
 quarkus.datasource.jdbc.min-size=16
-quarkus.datasource.jdbc.initial-size=64
+quarkus.datasource.jdbc.initial-size=512
 
 quarkus.log.console.enable=true
 quarkus.log.console.level=INFO
@@ -20,11 +20,18 @@ quarkus.log.level=INFO
 # Fully disable Hibernate ORM statistics gathering::
 quarkus.log.category."org.hibernate.engine.internal.StatisticalLoggingSessionEventListener".level=WARN
 
+# Explicitly disable 2LC as it's not used:
+quarkus.hibernate-orm.second-level-caching-enabled=false
+
 # To create the schema:
 %dev.quarkus.hibernate-orm.database.generation=drop-and-create
 %dev.quarkus.hibernate-orm.sql-load-script=import.sql
 quarkus.hibernate-orm.database.generation=validate
 quarkus.hibernate-orm.log.sql=false
 
+mp.context.ThreadContext.propagated=None
+mp.context.ThreadContext.cleared=None
+mp.context.ThreadContext.unchanged=Remaining
+
 
 

+ 0 - 20
frameworks/Java/quarkus/resteasy-hibernate/src/main/resources/fortunes.mustache

@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Fortunes</title>
-</head>
-<body>
-<table>
-    <tr>
-        <th>id</th>
-        <th>message</th>
-    </tr>
-    {{#fortunes}}
-        <tr>
-            <td>{{id}}</td>
-            <td>{{message}}</td>
-        </tr>
-    {{/fortunes}}
-</table>
-</body>
-</html>

+ 0 - 1
frameworks/Java/quarkus/resteasy-hibernate/start-app.sh

@@ -1 +0,0 @@
-java -XX:+FlightRecorder -XX:+UseParallelGC -Dquarkus.datasource.url=jdbc:postgresql://localhost:5432/hello_world?loggerLevel=OFF\&disableColumnSanitiser=true\&assumeMinServerVersion=12\&sslmode=disable -Dquarkus.http.host=127.0.0.1 -Djava.lang.Integer.IntegerCache.high=10000 -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true -Dhibernate.allow_update_outside_transaction=true -Djboss.threads.eqe.statistics=false -jar target/hibernate-1.0-SNAPSHOT-runner.jar

+ 28 - 6
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/pom.xml

@@ -6,13 +6,16 @@
         <groupId>io.quarkus</groupId>
         <artifactId>benchmark</artifactId>
         <version>1.0-SNAPSHOT</version>
-        <relativePath>../</relativePath>
     </parent>
 
     <groupId>io.quarkus.benchmark</groupId>
     <artifactId>resteasy-reactive-hibernate-reactive</artifactId>
 
     <dependencies>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-benchmark-common</artifactId>
+        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-scheduler</artifactId>
@@ -42,10 +45,29 @@
             <artifactId>netty-transport-native-epoll</artifactId>
             <classifier>linux-x86_64</classifier>
         </dependency>
-        <dependency>
-            <groupId>com.github.spullara.mustache.java</groupId>
-            <artifactId>compiler</artifactId>
-            <version>0.9.6</version>
-        </dependency>
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.fizzed</groupId>
+                <artifactId>rocker-maven-plugin</artifactId>
+                <version>1.3.0</version>
+                <executions>
+                    <execution>
+                        <id>generate-rocker-templates</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <configuration>
+                            <templateDirectory>${project.basedir}/src/main/resources</templateDirectory>
+                            <optimize>true</optimize>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+
+    </build>
 </project>

+ 11 - 3
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java

@@ -3,8 +3,10 @@ package io.quarkus.benchmark.filter;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 
+import javax.annotation.PostConstruct;
 import javax.inject.Singleton;
 
+import io.vertx.core.MultiMap;
 import org.jboss.resteasy.reactive.server.ServerResponseFilter;
 
 import io.quarkus.scheduler.Scheduled;
@@ -18,7 +20,12 @@ public class ServerHeaderFilter {
     private static final CharSequence SERVER_HEADER_VALUE = HttpHeaders.createOptimized("Quarkus");
     private static final CharSequence DATE_HEADER_NAME = HttpHeaders.createOptimized("Date");
     
-    private CharSequence date;
+    private volatile CharSequence date;
+
+    @PostConstruct
+    public void init() {
+        date = HttpHeaders.createOptimized(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()));
+    }
 
     @Scheduled(every="1s")
     void increment() {
@@ -27,7 +34,8 @@ public class ServerHeaderFilter {
 
     @ServerResponseFilter
     public void filter(HttpServerResponse response) {
-        response.putHeader(SERVER_HEADER_NAME, SERVER_HEADER_VALUE);
-        response.putHeader(DATE_HEADER_NAME, date);
+        MultiMap headers = response.headers();
+        headers.add(SERVER_HEADER_NAME, SERVER_HEADER_VALUE);
+        headers.add(DATE_HEADER_NAME, date);
     }
 }

+ 7 - 2
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/BaseRepository.java

@@ -9,11 +9,16 @@ import org.hibernate.reactive.mutiny.Mutiny;
 import io.smallrye.mutiny.Uni;
 
 public class BaseRepository {
+
     @Inject
     protected Mutiny.SessionFactory sf;
 
-    public <T> Uni<T> inSession(Function<Mutiny.Session, Uni<T>> work){
-        return sf.withSession(session -> work.apply(session));
+    public <T> Uni<T> inSession(Function<Mutiny.Session, Uni<T>> work) {
+        return sf.openSession().chain( session -> work.apply( session ).eventually( session::close ) );
+    }
+
+    public <T> Uni<T> inStatelessSession(Function<Mutiny.StatelessSession, Uni<T>> work) {
+        return sf.openStatelessSession().chain( session -> work.apply( session ).eventually( session::close ) );
     }
 
 }

+ 3 - 7
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java

@@ -14,12 +14,8 @@ import io.smallrye.mutiny.Uni;
 public class FortuneRepository extends BaseRepository {
 
     public Uni<List<Fortune>> findAll() {
-        return inSession(s -> {
-            CriteriaBuilder criteriaBuilder = sf.getCriteriaBuilder();
-            CriteriaQuery<Fortune> fortuneQuery = criteriaBuilder.createQuery(Fortune.class);
-            Root<Fortune> from = fortuneQuery.from(Fortune.class);
-            fortuneQuery.select(from);
-            return s.createQuery(fortuneQuery).getResultList();
-        });
+        return inStatelessSession(
+                session -> session.createQuery("SELECT F FROM Fortune F", Fortune.class).getResultList()
+        );
     }
 }

+ 38 - 22
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java

@@ -1,20 +1,17 @@
 package io.quarkus.benchmark.repository;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ThreadLocalRandom;
 
 import javax.inject.Singleton;
 
+import io.quarkus.benchmark.utils.LocalRandom;
+import io.quarkus.benchmark.utils.Randomizer;
 import org.hibernate.reactive.mutiny.Mutiny;
-import org.hibernate.reactive.mutiny.Mutiny.Session;
 
 import io.quarkus.benchmark.model.World;
 import io.smallrye.mutiny.Uni;
 
-
 @Singleton
 public class WorldRepository extends BaseRepository {
 
@@ -25,13 +22,13 @@ public class WorldRepository extends BaseRepository {
      */
     public Uni<Void> createData() {
         return inSession(s -> {
-            final ThreadLocalRandom random = ThreadLocalRandom.current();
+            final LocalRandom random = Randomizer.current();
             int MAX = 10000;
             Uni<Void>[] unis = new Uni[MAX];
-            for (int i=0; i<MAX; i++) {
+            for (int i = 0; i < MAX; i++) {
                 final World world = new World();
                 world.setId(i + 1);
-                world.setRandomNumber(1 + random.nextInt(10000));
+                world.setRandomNumber(random.getNextRandom());
                 unis[i] = s.persist(world).map(v -> null);
             }
             return Uni.combine().all().unis(unis).combinedWith(l -> null)
@@ -40,26 +37,45 @@ public class WorldRepository extends BaseRepository {
         });
     }
 
-    public Uni<World> find(int id) {
-        return inSession(session -> singleFind(session, id));
+    public Uni<List<World>> update(Mutiny.Session session, List<World> worlds) {
+        return session
+                .setBatchSize(worlds.size())
+                .flush()
+                .map(v -> worlds);
     }
 
-    public Uni<Collection<World>> update(Mutiny.Session s, Collection<World> worlds) {
-        return s.flush()
-                .map(v -> worlds);
-            }
+    public Uni<List<World>> findStateless(int count) {
+        return inStatelessSession(session -> findStateless(session, count));
+    }
+
+    private Uni<List<World>> findStateless(Mutiny.StatelessSession s, int count) {
+        //The rules require individual load: we can't use the Hibernate feature which allows load by multiple IDs
+        // as one single operation as Hibernate is too smart and will switch to use batched loads automatically.
+        // Hence, use this awkward alternative:
+        final LocalRandom localRandom = Randomizer.current();
+        List<Uni<World>> l = new ArrayList<>(count);
+        for (int i = 0; i < count; i++) {
+            l.add(s.get(World.class, localRandom.getNextRandom()));
+        }
+        return Uni.join().all(l).andFailFast();
+    }
 
-    public Uni<Collection<World>> find(Session s, Set<Integer> ids) {
-        //The rules require individual load: we can't use the Hibernate feature which allows load by multiple IDs as one single operation
-        ArrayList<Uni<World>> l = new ArrayList<>(ids.size());
-        for (Integer id : ids) {
-            l.add(singleFind(s, id));
+    public Uni<List<World>> findManaged(Mutiny.Session s, int count) {
+        final List<World> worlds = new ArrayList<>(count);
+        //The rules require individual load: we can't use the Hibernate feature which allows load by multiple IDs
+        // as one single operation as Hibernate is too smart and will switch to use batched loads.
+        // But also, we can't use "Uni#join" as we did in the above method as managed entities shouldn't use pipelining -
+        // so we also have to avoid Mutiny optimising things by establishing an explicit chain:
+        final LocalRandom localRandom = Randomizer.current();
+        Uni<Void> loopRoot = Uni.createFrom().voidItem();
+        for (int i = 0; i < count; i++) {
+            loopRoot = loopRoot.chain(() -> s.find(World.class, localRandom.getNextRandom()).invoke(word -> worlds.add(word)).replaceWithVoid());
         }
-        return Uni.combine().all().unis(l).combinedWith(list -> (List<World>)list);
+        return loopRoot.map(v -> worlds);
     }
 
-    private static Uni<World> singleFind(final Mutiny.Session ss, final Integer id) {
-        return ss.find(World.class, id);
+    public Uni<World> findStateless() {
+        return inStatelessSession(session -> session.get(World.class, Randomizer.current().getNextRandom()));
     }
 
 }

+ 27 - 51
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/DbResource.java

@@ -1,9 +1,6 @@
 package io.quarkus.benchmark.resource;
 
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.ThreadLocalRandom;
+import java.util.List;
 
 import javax.inject.Inject;
 import javax.ws.rs.GET;
@@ -12,12 +9,16 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
+import io.quarkus.benchmark.utils.LocalRandom;
+import io.quarkus.benchmark.utils.Randomizer;
 import org.hibernate.FlushMode;
 import org.hibernate.reactive.mutiny.Mutiny;
 
 import io.quarkus.benchmark.model.World;
 import io.quarkus.benchmark.repository.WorldRepository;
+import io.smallrye.context.api.CurrentThreadContext;
 import io.smallrye.mutiny.Uni;
+import org.eclipse.microprofile.context.ThreadContext;
 
 @Produces(MediaType.APPLICATION_JSON)
 @Path("/")
@@ -28,80 +29,55 @@ public class DbResource {
 
     @GET
     @Path("db")
+    @CurrentThreadContext(propagated = {}, cleared = {}, unchanged = ThreadContext.ALL_REMAINING)
     public Uni<World> db() {
-        return randomWorld();
+        return worldRepository.findStateless();
     }
 
     @GET
     @Path("queries")
-    public Uni<Collection<World>> queries(@QueryParam("queries") String queries) {
-        return worldRepository.inSession(session -> randomWorldForRead(session, parseQueryCount(queries)));
+    @CurrentThreadContext(propagated = {}, cleared = {}, unchanged = ThreadContext.ALL_REMAINING)
+    public Uni<List<World>> queries(@QueryParam("queries") String queries) {
+        final int queryCount = parseQueryCount(queries);
+        return worldRepository.findStateless(queryCount);
     }
 
-    private Uni<Collection<World>> randomWorldForRead(Mutiny.Session session, int count) {
-        Set<Integer> ids = new HashSet<>(count);
-        int counter = 0;
-        while (counter < count) {
-            counter += ids.add(Integer.valueOf(randomWorldNumber())) ? 1 : 0;
-        }
-        return worldRepository.find(session, ids);
+    @GET
+    @Path("createData")
+    @CurrentThreadContext(propagated = {}, cleared = {}, unchanged = ThreadContext.ALL_REMAINING)
+    public Uni<Void> createData() {
+        return worldRepository.createData();
+    }
+
+    private Uni<List<World>> randomWorldsForWrite(Mutiny.Session session, int count) {
+        return worldRepository.findManaged(session, count);
     }
 
     @GET
     @Path("updates")
-    public Uni<Collection<World>> updates(@QueryParam("queries") String queries) {
+    @CurrentThreadContext(propagated = {}, cleared = {}, unchanged = ThreadContext.ALL_REMAINING)
+    public Uni<List<World>> updates(@QueryParam("queries") String queries) {
         return worldRepository.inSession(session -> {
-            // FIXME: not supported
-            //          session.setJdbcBatchSize(worlds.size());
+
             session.setFlushMode(FlushMode.MANUAL);
 
-            var worlds = randomWorldForRead(session, parseQueryCount(queries));
+            Uni<List<World>> worlds = randomWorldsForWrite(session, parseQueryCount(queries));
             return worlds.flatMap(worldsCollection -> {
+                final LocalRandom localRandom = Randomizer.current();
                 worldsCollection.forEach( w -> {
                     //Read the one field, as required by the following rule:
                     // # vi. At least the randomNumber field must be read from the database result set.
                     final int previousRead = w.getRandomNumber();
                     //Update it, but make sure to exclude the current number as Hibernate optimisations would have us "fail"
                     //the verification:
-                    w.setRandomNumber(randomWorldNumber(previousRead));
+                    w.setRandomNumber(localRandom.getNextRandomExcluding(previousRead));
                 } );
-                
+
                 return worldRepository.update(session, worldsCollection);
             });
         });
     }
 
-    private Uni<World> randomWorld() {
-        return worldRepository.find(randomWorldNumber());
-    }
-
-    private int randomWorldNumber() {
-        return 1 + ThreadLocalRandom.current().nextInt(10000);
-    }
-
-    /**
-     * Also according to benchmark requirements, except that in this special case
-     * of the update test we need to ensure we'll actually generate an update operation:
-     * for this we need to generate a random number between 1 to 10000, but different
-     * from the current field value.
-     * @param previousRead
-     * @return
-     */
-    private int randomWorldNumber(final int previousRead) {
-        //conceptually split the random space in those before previousRead,
-        //and those after: this approach makes sure to not affect the random characteristics.
-        final int trueRandom = ThreadLocalRandom.current().nextInt(9999) + 2;
-        if (trueRandom<=previousRead) {
-            //all figures equal or before the current field read need to be shifted back by one
-            //so to avoid hitting the same number while not affecting the distribution.
-            return trueRandom - 1;
-        }
-        else {
-            //Those after are generated by taking the generated value 2...10000 as is.
-            return trueRandom;
-        }
-    }
-
     private int parseQueryCount(String textValue) {
         if (textValue == null) {
             return 1;

+ 17 - 21
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java

@@ -1,47 +1,43 @@
 package io.quarkus.benchmark.resource;
 
-import java.io.StringWriter;
-import java.util.Collections;
-import java.util.Comparator;
+import com.fizzed.rocker.Rocker;
+import com.fizzed.rocker.RockerOutput;
+import io.quarkus.benchmark.model.Fortune;
+import io.quarkus.benchmark.repository.FortuneRepository;
+import io.smallrye.context.api.CurrentThreadContext;
+import io.smallrye.mutiny.Uni;
+import io.vertx.core.http.HttpHeaders;
+import io.vertx.ext.web.templ.rocker.RockerTemplateEngine;
+import org.eclipse.microprofile.context.ThreadContext;
 
 import javax.inject.Inject;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
-
-import com.github.mustachejava.DefaultMustacheFactory;
-import com.github.mustachejava.Mustache;
-import com.github.mustachejava.MustacheFactory;
-
-import io.quarkus.benchmark.model.Fortune;
-import io.quarkus.benchmark.repository.FortuneRepository;
-import io.smallrye.mutiny.Uni;
+import java.util.Collections;
+import java.util.Comparator;
 
 @Path("/fortunes")
 public class FortuneResource  {
 
     @Inject
     FortuneRepository repository;
-    private Mustache template;
-    private Comparator<Fortune> fortuneComparator;
 
+    private static final Comparator<Fortune> fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
+    private static final RockerTemplateEngine templeEngine  = RockerTemplateEngine.create();
 
-    public FortuneResource() {
-        MustacheFactory mf = new DefaultMustacheFactory();
-        template = mf.compile("fortunes.mustache");
-        fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
-    }
+    private static final String FORTUNES_MAP_KEY = "fortunes";
+    private static final String FORTUNES_TEMPLATE_FILENAME = "Fortunes.rocker.html";
 
     @Produces("text/html; charset=UTF-8")
     @GET
+    @CurrentThreadContext(propagated = {}, cleared = {}, unchanged = ThreadContext.ALL_REMAINING)
     public Uni<String> fortunes() {
         return repository.findAll()
                 .map(fortunes -> {
                     fortunes.add(new Fortune(0, "Additional fortune added at request time."));
                     fortunes.sort(fortuneComparator);
-                    StringWriter writer = new StringWriter();
-                    template.execute(writer, Collections.singletonMap("fortunes", fortunes));
-                    return writer.toString();
+                    return templeEngine.render(Collections.singletonMap(FORTUNES_MAP_KEY, fortunes), FORTUNES_TEMPLATE_FILENAME).result().toString();
                 });
     }
 }

+ 7 - 0
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/JsonResource.java

@@ -5,6 +5,10 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
+import io.smallrye.common.annotation.NonBlocking;
+import io.smallrye.context.api.CurrentThreadContext;
+import org.eclipse.microprofile.context.ThreadContext;
+
 @Path("/json")
 public class JsonResource  {
 
@@ -12,7 +16,10 @@ public class JsonResource  {
 
     @Produces(MediaType.APPLICATION_JSON)
     @GET
+    @CurrentThreadContext(propagated = {}, cleared = {}, unchanged = ThreadContext.ALL_REMAINING)
+    @NonBlocking
     public Message json() {
+        // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#json-serialization
         return new Message(HELLO);
     }
 }

+ 16 - 1
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java

@@ -1,19 +1,34 @@
 package io.quarkus.benchmark.resource;
 
+import java.nio.charset.StandardCharsets;
+
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
+import io.smallrye.common.annotation.NonBlocking;
+import io.smallrye.context.api.CurrentThreadContext;
 import io.vertx.core.buffer.Buffer;
+import org.eclipse.microprofile.context.ThreadContext;
 
 @Path("/plaintext")
 public class PlaintextResource {
     private static final String HELLO_WORLD = "Hello, world!";
-    private static final Buffer HELLO_WORLD_BUFFER = Buffer.factory.directBuffer(HELLO_WORLD, "UTF-8");
+    private static final Buffer HELLO_WORLD_BUFFER;
+
+    static {
+        ByteBuf nettyBuffer = ByteBufAllocator.DEFAULT.directBuffer();
+        nettyBuffer.writeBytes(HELLO_WORLD.getBytes(StandardCharsets.UTF_8));
+        HELLO_WORLD_BUFFER = Buffer.buffer(nettyBuffer);
+    }
 
     @Produces(MediaType.TEXT_PLAIN)
     @GET
+    @CurrentThreadContext(propagated = {}, cleared = {}, unchanged = ThreadContext.ALL_REMAINING)
+    @NonBlocking
     public Buffer plaintext() {
         return HELLO_WORLD_BUFFER;
     }

+ 21 - 0
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/resources/Fortunes.rocker.html

@@ -0,0 +1,21 @@
+@import java.util.*
+@import io.quarkus.benchmark.model.*
+@args(List fortunes)
+<!DOCTYPE html>
+<html>
+<head><title>Fortunes</title></head>
+<body>
+<table>
+    <tr>
+        <th>id</th>
+        <th>message</th>
+    </tr>
+    @for ((ForIterator i, Fortune fortune) : fortunes) {
+    <tr>
+        <td>@fortune.getId()</td>
+        <td>@fortune.getMessage()</td>
+    </tr>
+    }
+</table>
+</body>
+</html>

+ 12 - 3
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/resources/application.properties

@@ -8,13 +8,22 @@ quarkus.datasource.reactive=true
 quarkus.datasource.reactive.url=postgresql://tfb-database:5432/hello_world
 %dev.quarkus.datasource.reactive.url=postgresql://localhost:5432/hello_world
 
-quarkus.datasource.reactive.thread-local=true
 quarkus.datasource.reactive.cache-prepared-statements=true
-quarkus.datasource.reactive.max-size=4
+quarkus.datasource.reactive.max-size=512
+quarkus.datasource.reactive.postgresql.pipelining-limit=100000
+
+# Explicitly disable 2LC as it's not used:
+quarkus.hibernate-orm.second-level-caching-enabled=false
 
 #quarkus.vertx.storage=false
 
 quarkus.log.console.enable=true
 quarkus.log.console.level=INFO
 quarkus.log.file.enable=false
-quarkus.log.level=INFO
+quarkus.log.level=INFO
+
+quarkus.vertx.prefer-native-transport=true
+
+mp.context.ThreadContext.propagated=None
+mp.context.ThreadContext.cleared=None
+mp.context.ThreadContext.unchanged=Remaining

+ 0 - 20
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/resources/fortunes.mustache

@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Fortunes</title>
-</head>
-<body>
-<table>
-    <tr>
-        <th>id</th>
-        <th>message</th>
-    </tr>
-    {{#fortunes}}
-        <tr>
-            <td>{{id}}</td>
-            <td>{{message}}</td>
-        </tr>
-    {{/fortunes}}
-</table>
-</body>
-</html>

+ 0 - 2
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/start-app.sh

@@ -1,2 +0,0 @@
-java -XX:+FlightRecorder -XX:+UseParallelGC -Dquarkus.datasource.url=vertx-reactive:postgresql://localhost:5432/hello_world -Dquarkus.http.host=127.0.0.1 -Djava.lang.Integer.IntegerCache.high=10000 -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true -Dhibernate.allow_update_outside_transaction=true -Djboss.threads.eqe.statistics=false -jar target/pgclient-1.0-SNAPSHOT-runner.jar
-

+ 36 - 5
frameworks/Java/quarkus/resteasy-reactive-hibernate/pom.xml

@@ -6,13 +6,16 @@
         <groupId>io.quarkus</groupId>
         <artifactId>benchmark</artifactId>
         <version>1.0-SNAPSHOT</version>
-        <relativePath>../</relativePath>
     </parent>
 
     <groupId>io.quarkus.benchmark</groupId>
     <artifactId>resteasy-reactive-hibernate</artifactId>
 
     <dependencies>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-benchmark-common</artifactId>
+        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-hibernate-orm</artifactId>
@@ -34,11 +37,39 @@
             <artifactId>quarkus-jdbc-postgresql</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.github.spullara.mustache.java</groupId>
-            <artifactId>compiler</artifactId>
-            <version>0.9.6</version>
+            <groupId>com.fizzed</groupId>
+            <artifactId>rocker-compiler</artifactId>
+            <version>1.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport-native-epoll</artifactId>
+            <classifier>linux-x86_64</classifier>
         </dependency>
-
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.fizzed</groupId>
+                <artifactId>rocker-maven-plugin</artifactId>
+                <version>1.3.0</version>
+                <executions>
+                    <execution>
+                        <id>generate-rocker-templates</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <configuration>
+                            <templateDirectory>${project.basedir}/src/main/resources</templateDirectory>
+                            <optimize>true</optimize>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+
+    </build>
+
 </project>

+ 7 - 1
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java

@@ -3,6 +3,7 @@ package io.quarkus.benchmark.filter;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 
+import javax.annotation.PostConstruct;
 import javax.inject.Singleton;
 import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.container.ContainerResponseContext;
@@ -16,7 +17,12 @@ import io.quarkus.scheduler.Scheduled;
 @Provider
 public class ServerHeaderFilter implements ContainerResponseFilter {
 
-    private String date;
+    private volatile String date;
+
+    @PostConstruct
+    public void init() {
+        date = DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now());
+    }
 
     @Scheduled(every="1s")
     void increment() {

+ 14 - 15
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java

@@ -1,10 +1,5 @@
 package io.quarkus.benchmark.repository;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Set;
-import java.util.concurrent.ThreadLocalRandom;
-
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import javax.transaction.Transactional;
@@ -15,6 +10,8 @@ import org.hibernate.SessionFactory;
 import org.hibernate.StatelessSession;
 
 import io.quarkus.benchmark.model.World;
+import io.quarkus.benchmark.utils.LocalRandom;
+import io.quarkus.benchmark.utils.Randomizer;
 
 
 @Singleton
@@ -31,26 +28,26 @@ public class WorldRepository {
     @Transactional
     public void createData() {
         try (StatelessSession statelessSession = sf.openStatelessSession()) {
-            final ThreadLocalRandom random = ThreadLocalRandom.current();
+            final LocalRandom random = Randomizer.current();
             for (int i=1; i<=10000; i++) {
                 final World world = new World();
                 world.setId(i);
-                world.setRandomNumber(1 + random.nextInt(10000));
+                world.setRandomNumber(random.getNextRandom());
                 statelessSession.insert(world);
             }
         }
     }
 
-    public World findSingleAndStateless(int id) {
+    public World findSingleAndStateless(Integer id) {
         try (StatelessSession ss = sf.openStatelessSession()) {
             return singleStatelessWorldLoad(ss,id);
         }
     }
 
     @Transactional
-    public void updateAll(Collection<World> worlds) {
+    public void updateAll(World[] worlds) {
         try (Session s = sf.openSession()) {
-            s.setJdbcBatchSize(worlds.size());
+            s.setJdbcBatchSize(worlds.length);
             s.setHibernateFlushMode(FlushMode.MANUAL);
             for (World w : worlds) {
                 s.update(w);
@@ -59,14 +56,16 @@ public class WorldRepository {
         }
     }
 
-    public Collection<World> findReadonly(Set<Integer> ids) {
+    public World[] findReadonly(int count) {
         try (StatelessSession s = sf.openStatelessSession()) {
             //The rules require individual load: we can't use the Hibernate feature which allows load by multiple IDs as one single operation
-            ArrayList l = new ArrayList<>(ids.size());
-            for (Integer id : ids) {
-                l.add(singleStatelessWorldLoad(s,id));
+            World[] list = new World[count];
+            final LocalRandom random = Randomizer.current();
+            for (int i=0;i<count;i++) {
+                Integer idToLoad = random.getNextRandom();
+                list[i] = singleStatelessWorldLoad(s,idToLoad);
             }
-            return l;
+            return list;
         }
     }
 

+ 12 - 56
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/DbResource.java

@@ -1,10 +1,5 @@
 package io.quarkus.benchmark.resource;
 
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.ThreadLocalRandom;
-
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import javax.ws.rs.Consumes;
@@ -16,6 +11,8 @@ import javax.ws.rs.core.MediaType;
 
 import io.quarkus.benchmark.model.World;
 import io.quarkus.benchmark.repository.WorldRepository;
+import io.quarkus.benchmark.utils.LocalRandom;
+import io.quarkus.benchmark.utils.Randomizer;
 import io.smallrye.common.annotation.Blocking;
 
 
@@ -32,7 +29,7 @@ public class DbResource {
     @GET
     @Path("/db")
     public World db() {
-        World world = randomWorldForRead();
+        World world = worldRepository.findSingleAndStateless(Randomizer.current().getNextRandom());
         if (world==null) throw new IllegalStateException( "No data found in DB. Did you seed the database? Make sure to invoke /createdata once." );
         return world;
     }
@@ -42,8 +39,7 @@ public class DbResource {
     @Path("/queries")
     public World[] queries(@QueryParam("queries") String queries) {
         final int count = parseQueryCount(queries);
-        World[] worlds = randomWorldForRead(count).toArray(new World[0]);
-        return worlds;
+        return randomWorldForRead(count);
     }
 
     @Blocking
@@ -56,17 +52,18 @@ public class DbResource {
     // all other tested frameworks seem to do.
     public World[] updates(@QueryParam("queries") String queries) {
         final int count = parseQueryCount(queries);
-        final Collection<World> worlds = randomWorldForRead(count);
-        worlds.forEach( w -> {
+        final World[] worlds = randomWorldForRead( count );
+        final LocalRandom random = Randomizer.current();
+        for (World w : worlds) {
             //Read the one field, as required by the following rule:
             // # vi. At least the randomNumber field must be read from the database result set.
             final int previousRead = w.getRandomNumber();
             //Update it, but make sure to exclude the current number as Hibernate optimisations would have us "fail"
             //the verification:
-            w.setRandomNumber(randomWorldNumber(previousRead));
-        } );
+            w.setRandomNumber(random.getNextRandomExcluding(previousRead));
+        }
         worldRepository.updateAll(worlds);
-        return worlds.toArray(new World[0]);
+        return worlds;
     }
 
     @Blocking
@@ -77,49 +74,8 @@ public class DbResource {
         return "OK";
     }
 
-    private World randomWorldForRead() {
-        return worldRepository.findSingleAndStateless(randomWorldNumber());
-    }
-
-    private Collection<World> randomWorldForRead(int count) {
-        Set<Integer> ids = new HashSet<>(count);
-        int counter = 0;
-        while (counter < count) {
-            counter += ids.add(Integer.valueOf(randomWorldNumber())) ? 1 : 0;
-        }
-        return worldRepository.findReadonly(ids);
-    }
-
-    /**
-     * According to benchmark requirements
-     * @return returns a number from 1 to 10000
-     */
-    private int randomWorldNumber() {
-        return 1 + ThreadLocalRandom.current().nextInt(10000);
-    }
-
-
-    /**
-     * Also according to benchmark requirements, except that in this special case
-     * of the update test we need to ensure we'll actually generate an update operation:
-     * for this we need to generate a random number between 1 to 10000, but different
-     * from the current field value.
-     * @param previousRead
-     * @return
-     */
-    private int randomWorldNumber(final int previousRead) {
-        //conceptually split the random space in those before previousRead,
-        //and those after: this approach makes sure to not affect the random characteristics.
-        final int trueRandom = ThreadLocalRandom.current().nextInt(9999) + 2;
-        if (trueRandom<=previousRead) {
-            //all figures equal or before the current field read need to be shifted back by one
-            //so to avoid hitting the same number while not affecting the distribution.
-            return trueRandom - 1;
-        }
-        else {
-            //Those after are generated by taking the generated value 2...10000 as is.
-            return trueRandom;
-        }
+    private World[] randomWorldForRead(int count) {
+        return worldRepository.findReadonly(count);
     }
 
     private int parseQueryCount(String textValue) {

+ 15 - 24
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java

@@ -1,10 +1,9 @@
 package io.quarkus.benchmark.resource;
 
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
+import com.fizzed.rocker.Rocker;
+import com.fizzed.rocker.RockerOutput;
+import io.quarkus.benchmark.model.Fortune;
+import io.quarkus.benchmark.repository.FortuneRepository;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -13,14 +12,10 @@ import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
-
-import com.github.mustachejava.DefaultMustacheFactory;
-import com.github.mustachejava.Mustache;
-import com.github.mustachejava.MustacheFactory;
-
-import io.quarkus.benchmark.model.Fortune;
-import io.quarkus.benchmark.repository.FortuneRepository;
-import io.smallrye.common.annotation.Blocking;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 
 @Singleton
 @Path("/")
@@ -31,16 +26,11 @@ public class FortuneResource {
     @Inject
     FortuneRepository repository;
 
-    private final Mustache template;
-    private final Comparator<Fortune> fortuneComparator;
+    private static final String FORTUNES_MAP_KEY = "fortunes";
+    private static final String FORTUNES_TEMPLATE_FILENAME = "Fortunes.rocker.html";
 
-    public FortuneResource() {
-        MustacheFactory mf = new DefaultMustacheFactory();
-        template = mf.compile("fortunes.mustache");
-        fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
-    }
+    private static final Comparator<Fortune> fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
 
-    @Blocking
     @GET
     @Path("/fortunes")
     public String fortunes() {
@@ -48,9 +38,10 @@ public class FortuneResource {
         fortunes.add(new Fortune(0, "Additional fortune added at request time."));
         fortunes.sort(fortuneComparator);
 
-        StringWriter writer = new StringWriter();
-        template.execute(writer, Collections.singletonMap("fortunes", fortunes));
+        RockerOutput output = Rocker.template(FORTUNES_TEMPLATE_FILENAME)
+                .bind(Collections.singletonMap(FORTUNES_MAP_KEY, fortunes))
+                .render();
 
-        return writer.toString();
+        return output.toString();
     }
 }

+ 3 - 0
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/JsonResource.java

@@ -1,5 +1,7 @@
 package io.quarkus.benchmark.resource;
 
+import io.smallrye.common.annotation.NonBlocking;
+
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
@@ -11,6 +13,7 @@ public class JsonResource {
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
+    @NonBlocking
     public Message json() {
         return new Message(HELLO);
     }

+ 21 - 4
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java

@@ -1,17 +1,34 @@
 package io.quarkus.benchmark.resource;
 
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
+import io.smallrye.common.annotation.NonBlocking;
+import io.smallrye.context.api.CurrentThreadContext;
+import io.vertx.core.buffer.Buffer;
+import org.eclipse.microprofile.context.ThreadContext;
+
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import java.nio.charset.StandardCharsets;
 
 @Path("/plaintext")
 public class PlaintextResource {
-    private static final String HELLO = "Hello, World!";
+    private static final String HELLO_WORLD = "Hello, world!";
+    private static final Buffer HELLO_WORLD_BUFFER;
+
+    static {
+        ByteBuf nettyBuffer = ByteBufAllocator.DEFAULT.directBuffer();
+        nettyBuffer.writeBytes(HELLO_WORLD.getBytes(StandardCharsets.UTF_8));
+        HELLO_WORLD_BUFFER = Buffer.buffer(nettyBuffer);
+    }
 
-    @GET
     @Produces(MediaType.TEXT_PLAIN)
-    public String plaintext() {
-        return HELLO;
+    @GET
+    @CurrentThreadContext(propagated = {}, cleared = {}, unchanged = ThreadContext.ALL_REMAINING)
+    @NonBlocking
+    public Buffer plaintext() {
+        return HELLO_WORLD_BUFFER;
     }
 }

+ 21 - 0
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/resources/Fortunes.rocker.html

@@ -0,0 +1,21 @@
+@import java.util.*
+@import io.quarkus.benchmark.model.*
+@args(List fortunes)
+<!DOCTYPE html>
+<html>
+<head><title>Fortunes</title></head>
+<body>
+<table>
+    <tr>
+        <th>id</th>
+        <th>message</th>
+    </tr>
+    @for ((ForIterator i, Fortune fortune) : fortunes) {
+    <tr>
+        <td>@fortune.getId()</td>
+        <td>@fortune.getMessage()</td>
+    </tr>
+    }
+</table>
+</body>
+</html>

+ 7 - 2
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/resources/application.properties

@@ -8,9 +8,9 @@ quarkus.datasource.jdbc.url=jdbc:postgresql://tfb-database:5432/hello_world?logg
 quarkus.datasource.jdbc.driver=org.postgresql.Driver
 quarkus.datasource.jdbc.transactions=disabled
 quarkus.datasource.jdbc.detect-statement-leaks=false
-quarkus.datasource.jdbc.max-size=64
+quarkus.datasource.jdbc.max-size=512
 quarkus.datasource.jdbc.min-size=16
-quarkus.datasource.jdbc.initial-size=64
+quarkus.datasource.jdbc.initial-size=512
 
 quarkus.log.console.enable=true
 quarkus.log.console.level=INFO
@@ -19,6 +19,8 @@ quarkus.log.level=INFO
 
 # Fully disable Hibernate ORM statistics gathering::
 quarkus.log.category."org.hibernate.engine.internal.StatisticalLoggingSessionEventListener".level=WARN
+# Explicitly disable 2LC as it's not used:
+quarkus.hibernate-orm.second-level-caching-enabled=false
 
 # To create the schema:
 %dev.quarkus.hibernate-orm.database.generation=drop-and-create
@@ -26,5 +28,8 @@ quarkus.log.category."org.hibernate.engine.internal.StatisticalLoggingSessionEve
 quarkus.hibernate-orm.database.generation=validate
 quarkus.hibernate-orm.log.sql=false
 
+mp.context.ThreadContext.propagated=None
+mp.context.ThreadContext.cleared=None
+mp.context.ThreadContext.unchanged=Remaining
 
 

+ 0 - 20
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/resources/fortunes.mustache

@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Fortunes</title>
-</head>
-<body>
-<table>
-    <tr>
-        <th>id</th>
-        <th>message</th>
-    </tr>
-    {{#fortunes}}
-        <tr>
-            <td>{{id}}</td>
-            <td>{{message}}</td>
-        </tr>
-    {{/fortunes}}
-</table>
-</body>
-</html>

+ 0 - 1
frameworks/Java/quarkus/resteasy-reactive-hibernate/start-app.sh

@@ -1 +0,0 @@
-java -XX:+FlightRecorder -XX:+UseParallelGC -Dquarkus.datasource.url=jdbc:postgresql://localhost:5432/hello_world?loggerLevel=OFF\&disableColumnSanitiser=true\&assumeMinServerVersion=12\&sslmode=disable -Dquarkus.http.host=127.0.0.1 -Djava.lang.Integer.IntegerCache.high=10000 -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true -Dhibernate.allow_update_outside_transaction=true -Djboss.threads.eqe.statistics=false -jar target/hibernate-1.0-SNAPSHOT-runner.jar

+ 0 - 117
frameworks/Java/quarkus/resteasy-reactive-pgclient/.factorypath

@@ -1,117 +0,0 @@
-<factorypath>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-scheduler/999-SNAPSHOT/quarkus-scheduler-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/cronutils/cron-utils/9.0.2/cron-utils-9.0.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-reactive-pg-client/999-SNAPSHOT/quarkus-reactive-pg-client-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-reactive-datasource/999-SNAPSHOT/quarkus-reactive-datasource-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-datasource/999-SNAPSHOT/quarkus-datasource-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-datasource-common/999-SNAPSHOT/quarkus-datasource-common-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-vault-spi/999-SNAPSHOT/quarkus-vault-spi-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-vertx/999-SNAPSHOT/quarkus-vertx-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-netty/999-SNAPSHOT/quarkus-netty-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-vertx-core/999-SNAPSHOT/quarkus-vertx-core-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/smallrye-axle-generator/0.0.13/smallrye-axle-generator-0.0.13.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/reactivex/rxjava2/rxjava/2.2.19/rxjava-2.2.19.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/smallrye-reactive-streams-operators/1.0.10/smallrye-reactive-streams-operators-1.0.10.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/eclipse/microprofile/reactive-streams-operators/microprofile-reactive-streams-operators-api/1.0/microprofile-reactive-streams-operators-api-1.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/eclipse/microprofile/reactive-streams-operators/microprofile-reactive-streams-operators-core/1.0/microprofile-reactive-streams-operators-core-1.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/vertx/vertx-codegen/3.8.5/vertx-codegen-3.8.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mvel/mvel2/2.3.1.Final/mvel2-2.3.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/smallrye-axle-core/0.0.13/smallrye-axle-core-0.0.13.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/vertx/vertx-rx-java2/3.8.5/vertx-rx-java2-3.8.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/vertx/vertx-rx-gen/3.8.5/vertx-rx-gen-3.8.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-mutiny/999-SNAPSHOT/quarkus-mutiny-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/mutiny/0.4.4/mutiny-0.4.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-smallrye-context-propagation/999-SNAPSHOT/quarkus-smallrye-context-propagation-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/smallrye-context-propagation/1.0.11/smallrye-context-propagation-1.0.11.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/smallrye-context-propagation-api/1.0.11/smallrye-context-propagation-api-1.0.11.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/mutiny-context-propagation/0.4.4/mutiny-context-propagation-0.4.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/smallrye-reactive-converter-api/1.0.10/smallrye-reactive-converter-api-1.0.10.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/smallrye-mutiny-vertx-core/0.0.13/smallrye-mutiny-vertx-core-0.0.13.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/smallrye-mutiny-vertx-runtime/0.0.13/smallrye-mutiny-vertx-runtime-0.0.13.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/vertx-mutiny-generator/0.0.13/vertx-mutiny-generator-0.0.13.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/vertx/vertx-pg-client/3.8.5/vertx-pg-client-3.8.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/vertx/vertx-core/3.8.5/vertx-core-3.8.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec-http2/4.1.45.Final/netty-codec-http2-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver-dns/4.1.45.Final/netty-resolver-dns-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec-dns/4.1.45.Final/netty-codec-dns-4.1.45.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/vertx/vertx-sql-client/3.8.5/vertx-sql-client-3.8.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/smallrye-axle-pg-client/0.0.13/smallrye-axle-pg-client-0.0.13.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/smallrye-axle-sql-client/0.0.13/smallrye-axle-sql-client-0.0.13.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/smallrye-mutiny-vertx-pg-client/0.0.13/smallrye-mutiny-vertx-pg-client-0.0.13.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/reactive/smallrye-mutiny-vertx-sql-client/0.0.13/smallrye-mutiny-vertx-sql-client-0.0.13.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-resteasy/999-SNAPSHOT/quarkus-resteasy-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-vertx-http/999-SNAPSHOT/quarkus-vertx-http-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-development-mode-spi/999-SNAPSHOT/quarkus-development-mode-spi-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/security/quarkus-security/1.0.1.Final/quarkus-security-1.0.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/enterprise/jakarta.enterprise.cdi-api/2.0.2/jakarta.enterprise.cdi-api-2.0.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/el/jakarta.el-api/3.0.3/jakarta.el-api-3.0.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/interceptor/jakarta.interceptor-api/1.2.5/jakarta.interceptor-api-1.2.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/vertx/vertx-web/3.8.5/vertx-web-3.8.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/vertx/vertx-web-common/3.8.5/vertx-web-common-3.8.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/vertx/vertx-auth-common/3.8.5/vertx-auth-common-3.8.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/vertx/vertx-bridge-common/3.8.5/vertx-bridge-common-3.8.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-resteasy-server-common/999-SNAPSHOT/quarkus-resteasy-server-common-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/resteasy/resteasy-core/4.5.3.Final/resteasy-core-4.5.3.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/spec/javax/ws/rs/jboss-jaxrs-api_2.1_spec/2.0.1.Final/jboss-jaxrs-api_2.1_spec-2.0.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/resteasy/resteasy-core-spi/4.5.3.Final/resteasy-core-spi-4.5.3.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/eclipse/microprofile/config/microprofile-config-api/1.4/microprofile-config-api-1.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/sun/activation/jakarta.activation/1.2.1/jakarta.activation-1.2.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-resteasy-jackson/999-SNAPSHOT/quarkus-resteasy-jackson-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-jackson/999-SNAPSHOT/quarkus-jackson-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.10.3/jackson-databind-2.10.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.3/jackson-datatype-jsr310-2.10.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.3/jackson-datatype-jdk8-2.10.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-parameter-names/2.10.3/jackson-module-parameter-names-2.10.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/resteasy/resteasy-jackson2-provider/4.5.3.Final/resteasy-jackson2-provider-4.5.3.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/resteasy/resteasy-jaxb-provider/4.5.3.Final/resteasy-jaxb-provider-4.5.3.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/glassfish/jaxb/jaxb-runtime/2.3.3-b02/jaxb-runtime-2.3.3-b02.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/glassfish/jaxb/txw2/2.3.3-b02/txw2-2.3.3-b02.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/sun/istack/istack-commons-runtime/3.0.10/istack-commons-runtime-3.0.10.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.10.3/jackson-core-2.10.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.10.3/jackson-jaxrs-json-provider-2.10.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.10.3/jackson-jaxrs-base-2.10.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.10.3/jackson-module-jaxb-annotations-2.10.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/fge/json-patch/1.9/json-patch-1.9.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/fge/jackson-coreutils/1.6/jackson-coreutils-1.6.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/fge/msg-simple/1.1/msg-simple-1.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/fge/btf/1.2/btf-1.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/27.0.1-jre/guava-27.0.1-jre.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec/2.0.0.Final/jboss-jaxb-api_2.3_spec-2.0.0.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-arc/999-SNAPSHOT/quarkus-arc-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/arc/arc/999-SNAPSHOT/arc-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-core/999-SNAPSHOT/quarkus-core-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/inject/jakarta.inject-api/1.0/jakarta.inject-api-1.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-ide-launcher/999-SNAPSHOT/quarkus-ide-launcher-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/config/smallrye-config/1.7.0/smallrye-config-1.7.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/smallrye/config/smallrye-config-common/1.7.0/smallrye-config-common-1.7.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/logmanager/jboss-logmanager-embedded/1.0.4/jboss-logmanager-embedded-1.0.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/logging/jboss-logging-annotations/2.1.0.Final/jboss-logging-annotations-2.1.0.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/threads/jboss-threads/3.0.1.Final/jboss-threads-3.0.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/slf4j/slf4j-jboss-logging/1.2.0.Final/slf4j-jboss-logging-1.2.0.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/graalvm/sdk/graal-sdk/19.3.1/graal-sdk-19.3.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/wildfly/common/wildfly-common/1.5.4.Final-format-001/wildfly-common-1.5.4.Final-format-001.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/eclipse/microprofile/context-propagation/microprofile-context-propagation-api/1.0.1/microprofile-context-propagation-api-1.0.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/quarkus/quarkus-jdbc-postgresql/999-SNAPSHOT/quarkus-jdbc-postgresql-999-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/postgresql/postgresql/42.2.12/postgresql-42.2.12.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/spullara/mustache/java/compiler/0.9.6/compiler-0.9.6.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="PLUGIN" id="org.eclipse.jst.ws.annotations.core" enabled="false" runInBatchMode="false"/>
-</factorypath>

+ 0 - 47
frameworks/Java/quarkus/resteasy-reactive-pgclient/pom.xml

@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project>
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>io.quarkus</groupId>
-        <artifactId>benchmark</artifactId>
-        <version>1.0-SNAPSHOT</version>
-        <relativePath>../</relativePath>
-    </parent>
-
-    <groupId>io.quarkus.benchmark</groupId>
-    <artifactId>resteasy-reactive-pgclient</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-scheduler</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-reactive-pg-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy-reactive</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.vertx</groupId>
-            <artifactId>vertx-web-templ-rocker</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-transport-native-epoll</artifactId>
-            <classifier>linux-x86_64</classifier>
-        </dependency>
-        <dependency>
-            <groupId>com.github.spullara.mustache.java</groupId>
-            <artifactId>compiler</artifactId>
-            <version>0.9.6</version>
-        </dependency>
-    </dependencies>
-</project>

+ 0 - 33
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java

@@ -1,33 +0,0 @@
-package io.quarkus.benchmark.filter;
-
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-
-import javax.inject.Singleton;
-
-import org.jboss.resteasy.reactive.server.ServerResponseFilter;
-
-import io.quarkus.scheduler.Scheduled;
-import io.vertx.core.http.HttpHeaders;
-import io.vertx.core.http.HttpServerResponse;
-
-@Singleton
-public class ServerHeaderFilter {
-
-    private static final CharSequence SERVER_HEADER_NAME = HttpHeaders.createOptimized("Server");
-    private static final CharSequence SERVER_HEADER_VALUE = HttpHeaders.createOptimized("Quarkus");
-    private static final CharSequence DATE_HEADER_NAME = HttpHeaders.createOptimized("Date");
-    
-    private CharSequence date;
-
-    @Scheduled(every="1s")
-    void increment() {
-        date = HttpHeaders.createOptimized(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()));
-    }
-
-    @ServerResponseFilter
-    public void filter(HttpServerResponse response) {
-        response.putHeader(SERVER_HEADER_NAME, SERVER_HEADER_VALUE);
-        response.putHeader(DATE_HEADER_NAME, date);
-    }
-}

+ 0 - 48
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/model/Fortune.java

@@ -1,48 +0,0 @@
-package io.quarkus.benchmark.model;
-
-import java.util.Objects;
-
-public class Fortune {
-
-    private int id;
-    private String message;
-
-    public Fortune() {}
-
-    public Fortune(int id, String message) {
-        this.id = id;
-        this.message = message;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o)
-            return true;
-        if (o == null || getClass() != o.getClass())
-            return false;
-        Fortune fortune = (Fortune) o;
-        return id == fortune.id &&
-                Objects.equals(message, fortune.message);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id, message);
-    }
-}

+ 0 - 35
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/model/World.java

@@ -1,35 +0,0 @@
-package io.quarkus.benchmark.model;
-
-public class World implements Comparable<World>{
-
-    private int id;
-    private int randomNumber;
-
-    public World() {}
-
-    public World(int id, int randomNumber) {
-        this.id = id;
-        this.randomNumber = randomNumber;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    public int getRandomNumber() {
-        return randomNumber;
-    }
-
-    public void setRandomNumber(int randomNumber) {
-        this.randomNumber = randomNumber;
-    }
-
-    @Override
-    public int compareTo(World o) {
-        return Integer.compare(id, o.id);
-    }
-}

+ 0 - 30
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java

@@ -1,30 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-
-import io.quarkus.benchmark.model.Fortune;
-import io.smallrye.mutiny.Uni;
-import io.vertx.mutiny.sqlclient.Row;
-
-@ApplicationScoped
-public class FortuneRepository {
-
-    @Inject
-    PgClients clients;
-
-    public Uni<List<Fortune>> findAll() {
-        return clients.getClient().preparedQuery("SELECT * FROM Fortune" )
-                .execute()
-                .map(rowset -> {
-                    List<Fortune> ret = new ArrayList<>(rowset.size()+1);
-                    for(Row r : rowset) {
-                        ret.add(new Fortune(r.getInteger("id"), r.getString("message")));
-                    }
-                    return ret;
-                });
-    }
-}

+ 0 - 56
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java

@@ -1,56 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.Produces;
-import javax.inject.Inject;
-
-import org.eclipse.microprofile.config.inject.ConfigProperty;
-
-import io.vertx.mutiny.core.Vertx;
-import io.vertx.mutiny.pgclient.PgPool;
-import io.vertx.pgclient.PgConnectOptions;
-import io.vertx.sqlclient.PoolOptions;
-
-@ApplicationScoped
-public class PgClientFactory {
-
-    // vertx-reactive:postgresql://tfb-database:5432/hello_world
-    private static final String PG_URI_MATCHER = "vertx-reactive:postgresql://([-a-zA-Z]+):([0-9]+)/(.*)";
-
-    @ConfigProperty(name = "quarkus.datasource.url")
-	String url;
-
-	@ConfigProperty(name = "quarkus.datasource.username")
-	String user;
-
-	@ConfigProperty(name = "quarkus.datasource.password")
-	String pass;
-
-	@Inject
-	Vertx vertx;
-
-	@Produces
-	@ApplicationScoped
-	public PgClients pgClients() {
-	    return new PgClients(this);
-	}
-
-
-	PgPool sqlClient(int size) {
-		PoolOptions options = new PoolOptions();
-		PgConnectOptions connectOptions = new PgConnectOptions();
-		Matcher matcher = Pattern.compile(PG_URI_MATCHER).matcher(url);
-		matcher.matches();
-		connectOptions.setDatabase(matcher.group(3));
-		connectOptions.setHost(matcher.group(1));
-		connectOptions.setPort(Integer.parseInt(matcher.group(2)));
-		connectOptions.setUser(user);
-		connectOptions.setPassword(pass);
-		connectOptions.setCachePreparedStatements(true);
-		options.setMaxSize(size);
-		return PgPool.pool(vertx, connectOptions, options);
-	}
-}

+ 0 - 38
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClients.java

@@ -1,38 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import io.vertx.mutiny.pgclient.PgPool;
-import io.vertx.mutiny.sqlclient.SqlClient;
-
-class PgClients {
-    private static final int POOL_SIZE = 4;
-
-    private ThreadLocal<SqlClient> sqlClient = new ThreadLocal<>();
-    private ThreadLocal<PgPool> pool = new ThreadLocal<>();
-    private PgClientFactory pgClientFactory;
-
-	// for ArC
-	public PgClients() {
-	}
-
-	public PgClients(PgClientFactory pgClientFactory) {
-	    this.pgClientFactory = pgClientFactory;
-    }
-
-    SqlClient getClient() {
-        SqlClient ret = sqlClient.get();
-        if(ret == null) {
-            ret = pgClientFactory.sqlClient(1);
-            sqlClient.set(ret);
-        }
-		return ret;
-	}
-
-	synchronized PgPool getPool() {
-        PgPool ret = pool.get();
-        if(ret == null) {
-            ret = pgClientFactory.sqlClient(POOL_SIZE);
-            pool.set(ret);
-        }
-        return ret;
-	}
-}

+ 0 - 40
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java

@@ -1,40 +0,0 @@
-package io.quarkus.benchmark.repository;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-
-import io.quarkus.benchmark.model.World;
-import io.smallrye.mutiny.Uni;
-import io.vertx.mutiny.sqlclient.Row;
-import io.vertx.mutiny.sqlclient.Tuple;
-
-@ApplicationScoped
-public class WorldRepository {
-
-    @Inject
-    PgClients clients;
-
-    public Uni<World> find(int id) {
-        return clients.getClient().preparedQuery("SELECT id, randomNumber FROM World WHERE id = $1")
-                .execute(Tuple.of(id))
-                .map(rowset -> {
-                    Row row = rowset.iterator().next();
-                    return new World(row.getInteger(0), row.getInteger(1));
-                });
-    }
-
-    public Uni<Void> update(World[] worlds) {
-        Arrays.sort(worlds);
-        List<Tuple> args = new ArrayList<>(worlds.length);
-        for (World world : worlds) {
-            args.add(Tuple.of(world.getId(), world.getRandomNumber()));
-        }
-        return clients.getPool().preparedQuery("UPDATE World SET randomNumber = $2 WHERE id = $1")
-                .executeBatch(args)
-                .map(v -> null);
-    }
-}

+ 0 - 83
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java

@@ -1,83 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.ThreadLocalRandom;
-
-import javax.inject.Inject;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-
-import io.quarkus.benchmark.model.World;
-import io.quarkus.benchmark.repository.WorldRepository;
-import io.smallrye.mutiny.Uni;
-
-@Produces(MediaType.APPLICATION_JSON)
-@Path("/")
-public class DbResource {
-
-    @Inject
-    WorldRepository worldRepository;
-
-    @GET
-    @Path("db")
-    public Uni<World> db() {
-        return randomWorld();
-    }
-
-    @GET
-    @Path("queries")
-    public Uni<List<World>> queries(@QueryParam("queries") String queries) {
-        var worlds = new Uni[parseQueryCount(queries)];
-        var ret = new World[worlds.length];
-        Arrays.setAll(worlds, i -> {
-            return randomWorld().map(w -> ret[i] = w);
-        });
-
-        return Uni.combine().all().unis(worlds)
-                .combinedWith(v -> Arrays.asList(ret));
-    }
-
-    @GET
-    @Path("updates")
-    public Uni<List<World>> updates(@QueryParam("queries") String queries) {
-        var worlds = new Uni[parseQueryCount(queries)];
-        var ret = new World[worlds.length];
-        Arrays.setAll(worlds, i -> {
-            return randomWorld().map(w -> {
-                w.setRandomNumber(randomWorldNumber());
-                ret[i] = w;
-                return w;
-            });
-        });
-
-        return Uni.combine().all().unis(worlds)
-        .combinedWith(v -> null)
-        .flatMap(v -> worldRepository.update(ret))
-        .map(v -> Arrays.asList(ret));
-    }
-
-    private Uni<World> randomWorld() {
-        return worldRepository.find(randomWorldNumber());
-    }
-
-    private int randomWorldNumber() {
-        return 1 + ThreadLocalRandom.current().nextInt(10000);
-    }
-
-    private int parseQueryCount(String textValue) {
-        if (textValue == null) {
-            return 1;
-        }
-        int parsedValue;
-        try {
-            parsedValue = Integer.parseInt(textValue);
-        } catch (NumberFormatException e) {
-            return 1;
-        }
-        return Math.min(500, Math.max(1, parsedValue));
-    }
-}

+ 0 - 47
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java

@@ -1,47 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import java.io.StringWriter;
-import java.util.Collections;
-import java.util.Comparator;
-
-import javax.inject.Inject;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-
-import com.github.mustachejava.DefaultMustacheFactory;
-import com.github.mustachejava.Mustache;
-import com.github.mustachejava.MustacheFactory;
-
-import io.quarkus.benchmark.model.Fortune;
-import io.quarkus.benchmark.repository.FortuneRepository;
-import io.smallrye.mutiny.Uni;
-
-@Path("/fortunes")
-public class FortuneResource  {
-
-    @Inject
-    FortuneRepository repository;
-    private Mustache template;
-    private Comparator<Fortune> fortuneComparator;
-
-
-    public FortuneResource() {
-        MustacheFactory mf = new DefaultMustacheFactory();
-        template = mf.compile("fortunes.mustache");
-        fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
-    }
-
-    @Produces("text/html; charset=UTF-8")
-    @GET
-    public Uni<String> fortunes() {
-        return repository.findAll()
-                .map(fortunes -> {
-                    fortunes.add(new Fortune(0, "Additional fortune added at request time."));
-                    fortunes.sort(fortuneComparator);
-                    StringWriter writer = new StringWriter();
-                    template.execute(writer, Collections.singletonMap("fortunes", fortunes));
-                    return writer.toString();
-                });
-    }
-}

+ 0 - 19
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonResource.java

@@ -1,19 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-@Path("/json")
-public class JsonResource  {
-
-    private static final String HELLO = "Hello, World!";
-
-    @Produces(MediaType.APPLICATION_JSON)
-    @GET
-    public Message json() {
-        return new Message(HELLO);
-    }
-}
-

+ 0 - 13
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/resource/Message.java

@@ -1,13 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-public class Message {
-  private final String message;
-
-  public Message(String message) {
-    this.message = message;
-  }
-
-  public String getMessage() {
-    return message;
-  }
-}

+ 0 - 20
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java

@@ -1,20 +0,0 @@
-package io.quarkus.benchmark.resource;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-import io.vertx.core.buffer.Buffer;
-
-@Path("/plaintext")
-public class PlaintextResource {
-    private static final String HELLO_WORLD = "Hello, world!";
-    private static final Buffer HELLO_WORLD_BUFFER = Buffer.factory.directBuffer(HELLO_WORLD, "UTF-8");
-
-    @Produces(MediaType.TEXT_PLAIN)
-    @GET
-    public Buffer plaintext() {
-        return HELLO_WORLD_BUFFER;
-    }
-}

+ 0 - 10
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/resources/application.properties

@@ -1,10 +0,0 @@
-quarkus.datasource.url=vertx-reactive:postgresql://tfb-database:5432/hello_world
-%dev.quarkus.datasource.url=vertx-reactive:postgresql://localhost:5432/hello_world
-quarkus.datasource.username=benchmarkdbuser
-quarkus.datasource.password=benchmarkdbpass
-quarkus.datasource.reactive.max-size=64
-quarkus.log.console.enable=true
-quarkus.log.console.level=INFO
-quarkus.log.file.enable=false
-quarkus.log.level=INFO
-quarkus.vertx.prefer-native-transport=true

+ 0 - 20
frameworks/Java/quarkus/resteasy-reactive-pgclient/src/main/resources/fortunes.mustache

@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Fortunes</title>
-</head>
-<body>
-<table>
-    <tr>
-        <th>id</th>
-        <th>message</th>
-    </tr>
-    {{#fortunes}}
-        <tr>
-            <td>{{id}}</td>
-            <td>{{message}}</td>
-        </tr>
-    {{/fortunes}}
-</table>
-</body>
-</html>

+ 0 - 2
frameworks/Java/quarkus/resteasy-reactive-pgclient/start-app.sh

@@ -1,2 +0,0 @@
-java -XX:+FlightRecorder -XX:+UseParallelGC -Dquarkus.datasource.url=vertx-reactive:postgresql://localhost:5432/hello_world -Dquarkus.http.host=127.0.0.1 -Djava.lang.Integer.IntegerCache.high=10000 -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true -Dhibernate.allow_update_outside_transaction=true -Djboss.threads.eqe.statistics=false -jar target/pgclient-1.0-SNAPSHOT-runner.jar
-

+ 38 - 0
frameworks/Java/quarkus/run_quarkus.sh

@@ -0,0 +1,38 @@
+#!/bin/bash
+
+# JFR: -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=/quarkus/trace.jfr
+#       and use docker cp to read it
+
+# PROFILING: -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints
+
+# DEBUG: -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005
+
+# Consider using -Dquarkus.http.io-threads=$((`grep --count ^processor /proc/cpuinfo`)) \
+
+JAVA_OPTIONS="-server \
+  -Dquarkus.vertx.prefer-native-transport=true  \
+  -XX:-StackTraceInThrowable \
+  -Dquarkus.http.accept-backlog=-1 \
+  -Dio.netty.buffer.checkBounds=false \
+  -Dio.netty.buffer.checkAccessible=false \
+  -Djava.util.logging.manager=org.jboss.logmanager.LogManager \
+  -XX:-UseBiasedLocking \
+  -XX:+UseStringDeduplication \
+  -XX:+UseNUMA \
+  -XX:+UseParallelGC \
+  -Djava.lang.Integer.IntegerCache.high=10000 \
+  -Dvertx.disableURIValidation=true \
+  -Dvertx.disableHttpHeadersValidation=true \
+  -Dvertx.disableMetrics=true \
+  -Dvertx.disableH2c=true \
+  -Dvertx.disableWebsockets=true \
+  -Dvertx.flashPolicyHandler=false \
+  -Dvertx.threadChecks=false \
+  -Dvertx.disableContextTimings=true \
+  -Dhibernate.allow_update_outside_transaction=true \
+  -Dio.quarkus.vertx.core.runtime.context.VertxContextSafetyToggle.I_HAVE_CHECKED_EVERYTHING=true \
+  -Djboss.threads.eqe.statistics=false \
+  -Dmutiny.disableCallBackDecorators=true \
+  $@"
+
+java $JAVA_OPTIONS -jar quarkus-run.jar