Selaa lähdekoodia

Quarkus tuning (#5806)

Switch template engine to Rocker for quarkus-pgclient

Bump quarkus version from 1.4.2.Final to 1.5.2.Final
John O'Hara 5 vuotta sitten
vanhempi
commit
7af6fe2d5a

+ 6 - 0
frameworks/Java/quarkus/hibernate/pom.xml

@@ -21,6 +21,12 @@
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-hibernate-orm</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.github.spullara.mustache.java</groupId>
+            <artifactId>compiler</artifactId>
+            <version>0.9.6</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 32 - 0
frameworks/Java/quarkus/pgclient/pom.xml

@@ -25,5 +25,37 @@
             <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>
     </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>

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

@@ -18,6 +18,7 @@ public class FortuneRepository {
 
     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) {

+ 5 - 3
frameworks/Java/quarkus/pgclient/src/main/java/io/quarkus/benchmark/repository/pgclient/WorldRepository.java

@@ -19,7 +19,8 @@ public class WorldRepository {
     PgClients clients;
 
     public Uni<World> find(int id) {
-        return clients.getClient().preparedQuery("SELECT id, randomNumber FROM World WHERE id = $1", Tuple.of(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));
@@ -29,10 +30,11 @@ public class WorldRepository {
     public Uni<Void> update(World[] worlds) {
         Arrays.sort(worlds);
         List<Tuple> args = new ArrayList<>(worlds.length);
-        for(World world : worlds) {
+        for (World world : worlds) {
             args.add(Tuple.of(world.getId(), world.getRandomNumber()));
         }
-        return clients.getPool().preparedBatch("UPDATE World SET randomNumber = $2 WHERE id = $1", args)
+        return clients.getPool().preparedQuery("UPDATE World SET randomNumber = $2 WHERE id = $1")
+                .executeBatch(args)
                 .map(v -> null);
     }
 }

+ 5 - 14
frameworks/Java/quarkus/pgclient/src/main/java/io/quarkus/benchmark/resource/pgclient/BaseResource.java

@@ -1,24 +1,15 @@
 package io.quarkus.benchmark.resource.pgclient;
 
-import javax.inject.Inject;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
+import io.vertx.core.http.HttpHeaders;
+import io.vertx.core.json.Json;
 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);
-        }   
+        rc.response()
+                .putHeader(HttpHeaders.CONTENT_TYPE, "application/json")
+                .end(Json.encodeToBuffer(value));
     }
 
     Void handleFail(RoutingContext rc, Throwable t) {

+ 23 - 23
frameworks/Java/quarkus/pgclient/src/main/java/io/quarkus/benchmark/resource/pgclient/FortuneResource.java

@@ -1,20 +1,15 @@
 package io.quarkus.benchmark.resource.pgclient;
 
-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.pgclient.FortuneRepository;
 import io.quarkus.vertx.web.Route;
+import io.vertx.core.http.HttpHeaders;
 import io.vertx.ext.web.RoutingContext;
+import io.vertx.reactivex.ext.web.templ.rocker.RockerTemplateEngine;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import java.util.Comparator;
 
 @ApplicationScoped
 public class FortuneResource extends BaseResource {
@@ -22,24 +17,29 @@ public class FortuneResource extends BaseResource {
     @Inject
     FortuneRepository repository;
 
-    private final Mustache template;
+    private final RockerTemplateEngine templeEngine;
 
     public FortuneResource() {
-        MustacheFactory mf = new DefaultMustacheFactory();
-        template = mf.compile("fortunes.mustache");
+        templeEngine = RockerTemplateEngine.create();
     }
 
     @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(Comparator.comparing(fortune -> fortune.getMessage()));
-            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));
+                .subscribe().with(fortunes -> {
+                    fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+                    fortunes.sort(Comparator.comparing(fortune -> fortune.getMessage()));
+                    rc.put("fortunes", fortunes);
+                    templeEngine.render(rc.data(), "templates/Fortunes.rocker.html", res -> {
+                        if (res.succeeded()) {
+                            rc.response()
+                                    .putHeader(HttpHeaders.CONTENT_TYPE, "text/html; charset=UTF-8")
+                                    .end(res.result().toString());
+                        } else {
+                            rc.fail(res.cause());
+                        }
+                    });
+                },
+                t -> handleFail(rc, t));
     }
 }

+ 1 - 4
frameworks/Java/quarkus/pgclient/src/main/java/io/quarkus/benchmark/resource/pgclient/JsonResource.java

@@ -1,7 +1,5 @@
 package io.quarkus.benchmark.resource.pgclient;
 
-import java.util.Collections;
-
 import javax.enterprise.context.ApplicationScoped;
 
 import io.quarkus.vertx.web.Route;
@@ -10,12 +8,11 @@ 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 ));
+        sendJson(rc, new Message(HELLO));
     }
 }
 

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

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

+ 2 - 1
frameworks/Java/quarkus/pgclient/src/main/java/io/quarkus/benchmark/resource/pgclient/PlaintextResource.java

@@ -3,11 +3,12 @@ package io.quarkus.benchmark.resource.pgclient;
 import javax.enterprise.context.ApplicationScoped;
 
 import io.quarkus.vertx.web.Route;
+import io.vertx.core.buffer.Buffer;
 import io.vertx.ext.web.RoutingContext;
 
 @ApplicationScoped
 public class PlaintextResource {
-    private static final String HELLO = "Hello, World!";
+    private static final Buffer HELLO = Buffer.buffer("Hello, World!");
 
     @Route(path = "plaintext")
     public void plaintext(RoutingContext rc) {

+ 2 - 1
frameworks/Java/quarkus/pgclient/src/main/resources/application.properties

@@ -5,4 +5,5 @@ quarkus.datasource.max-size=64
 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

+ 21 - 0
frameworks/Java/quarkus/pgclient/src/main/resources/templates/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>

+ 1 - 6
frameworks/Java/quarkus/pom.xml

@@ -8,7 +8,7 @@
     <packaging>pom</packaging>
 
     <properties>
-        <quarkus.version>1.4.2.Final</quarkus.version>
+        <quarkus.version>1.5.2.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>
@@ -54,11 +54,6 @@
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-jdbc-postgresql</artifactId>
         </dependency>
-        <dependency>
-            <groupId>com.github.spullara.mustache.java</groupId>
-            <artifactId>compiler</artifactId>
-            <version>0.9.6</version>
-        </dependency>
     </dependencies>
 
     <build>

+ 1 - 1
frameworks/Java/quarkus/quarkus-pgclient.dockerfile

@@ -15,4 +15,4 @@ FROM openjdk:11.0.6-jdk-slim
 WORKDIR /quarkus
 COPY --from=maven /quarkus/pgclient/target/lib lib
 COPY --from=maven /quarkus/pgclient/target/pgclient-1.0-SNAPSHOT-runner.jar app.jar
-CMD ["java", "-server", "-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"]
+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"]

+ 1 - 1
frameworks/Java/quarkus/quarkus.dockerfile

@@ -15,4 +15,4 @@ FROM openjdk:11.0.6-jdk-slim
 WORKDIR /quarkus
 COPY --from=maven /quarkus/hibernate/target/lib lib
 COPY --from=maven /quarkus/hibernate/target/hibernate-1.0-SNAPSHOT-runner.jar app.jar
-CMD ["java", "-server", "-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"]
+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"]