Browse Source

Update to 4.2 + avoid executing HTTP operations on Vertx thread pool (#8574)

Denis Stepanov 1 year ago
parent
commit
1883313dcc

+ 12 - 6
frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AsyncBenchmarkController.java

@@ -9,12 +9,15 @@ import io.micronaut.http.HttpResponse;
 import io.micronaut.http.annotation.Controller;
 import io.micronaut.http.annotation.Get;
 import io.micronaut.http.annotation.QueryValue;
+import io.micronaut.scheduling.TaskExecutors;
+import jakarta.inject.Named;
 import views.fortunes;
 
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.concurrent.CompletionStage;
+import java.util.concurrent.Executor;
 
 import static java.util.Comparator.comparing;
 
@@ -24,11 +27,14 @@ public class AsyncBenchmarkController extends AbstractBenchmarkController {
 
     private final AsyncWorldRepository worldRepository;
     private final AsyncFortuneRepository fortuneRepository;
+    private final Executor executor;
 
     public AsyncBenchmarkController(AsyncWorldRepository worldRepository,
-                                    AsyncFortuneRepository fortuneRepository) {
+                                    AsyncFortuneRepository fortuneRepository,
+                                    @Named(TaskExecutors.BLOCKING) Executor executor) {
         this.worldRepository = worldRepository;
         this.fortuneRepository = fortuneRepository;
+        this.executor = executor;
     }
 
     @Get("/prepare-data-for-test")
@@ -39,7 +45,7 @@ public class AsyncBenchmarkController extends AbstractBenchmarkController {
     // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#single-database-query
     @Get("/db")
     public CompletionStage<World> db() {
-        return worldRepository.findById(randomId());
+        return worldRepository.findById(randomId()).thenApplyAsync(world -> world, executor);
     }
 
     // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#multiple-database-queries
@@ -50,20 +56,20 @@ public class AsyncBenchmarkController extends AbstractBenchmarkController {
         for (int i = 0; i < count; i++) {
             ids.add(randomId());
         }
-        return worldRepository.findByIds(ids);
+        return worldRepository.findByIds(ids).thenApplyAsync(worlds -> worlds, executor);
     }
 
     // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes
     @Get(value = "/fortunes", produces = "text/html;charset=utf-8")
     public CompletionStage<HttpResponse<String>> fortune() {
-        return fortuneRepository.findAll().thenApply(fortuneList -> {
+        return fortuneRepository.findAll().thenApplyAsync(fortuneList -> {
             List<Fortune> all = new ArrayList<>(fortuneList.size() + 1);
             all.add(new Fortune(0, "Additional fortune added at request time."));
             all.addAll(fortuneList);
             all.sort(comparing(Fortune::message));
             String body = fortunes.template(all).render().toString();
             return HttpResponse.ok(body).contentType("text/html;charset=utf-8");
-        });
+        }, executor);
     }
 
     // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates
@@ -74,7 +80,7 @@ public class AsyncBenchmarkController extends AbstractBenchmarkController {
                 world.setRandomNumber(randomWorldNumber());
             }
             worlds.sort(Comparator.comparingInt(World::getId)); // Avoid deadlock
-            return worldRepository.updateAll(worlds).thenApply(ignore -> worlds);
+            return worldRepository.updateAll(worlds).thenApplyAsync(ignore -> worlds, executor);
         });
     }
 

+ 1 - 1
frameworks/Java/micronaut/gradle.properties

@@ -1 +1 @@
-micronautVersion = 4.1.6
+micronautVersion = 4.2.0