From 870ec24747ed397efb4d62c1790599a7633e3f5e Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Sun, 2 Jun 2024 13:22:08 -0400 Subject: [PATCH 1/3] use virtual thread executor by default --- .../avaje/http/client/DHttpClientBuilder.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java index ecb898046..bf8d0bca2 100644 --- a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java +++ b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java @@ -16,10 +16,16 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.function.Function; import static java.util.Objects.requireNonNull; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + final class DHttpClientBuilder implements HttpClient.Builder, HttpClient.Builder.State { private java.net.http.HttpClient client; @@ -99,6 +105,20 @@ private java.net.http.HttpClient defaultClient() { } if (executor != null) { builder.executor(executor); + } else { + try { + ExecutorService virtualExecutorService = + (ExecutorService) + MethodHandles.lookup() + .findStatic( + Executors.class, + "newVirtualThreadPerTaskExecutor", + MethodType.methodType(ExecutorService.class)) + .invokeExact(); + builder.executor(virtualExecutorService); + } catch (Throwable t) { + // Nothing to do + } } if (proxy != null) { builder.proxy(proxy); From 6c95ba87f9aa8bd44a6afd457a1a1d26ac7d4535 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Tue, 4 Jun 2024 19:38:33 -0400 Subject: [PATCH 2/3] only try if > 21 --- .../main/java/io/avaje/http/client/DHttpClientBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java index bf8d0bca2..09a8a96a0 100644 --- a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java +++ b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java @@ -105,7 +105,7 @@ private java.net.http.HttpClient defaultClient() { } if (executor != null) { builder.executor(executor); - } else { + } else if (Integer.getInteger("java.specification.version") >= 21) { try { ExecutorService virtualExecutorService = (ExecutorService) @@ -117,7 +117,7 @@ private java.net.http.HttpClient defaultClient() { .invokeExact(); builder.executor(virtualExecutorService); } catch (Throwable t) { - // Nothing to do + // Impossible } } if (proxy != null) { From dc7649d092276c195f0e0d9448deae800773426d Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 14 Nov 2024 21:57:02 +1300 Subject: [PATCH 3/3] [Http client] #442 extract helper method for newVirtualThreadPerTaskExecutor --- .../avaje/http/client/DHttpClientBuilder.java | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java index 09a8a96a0..72e83fb1d 100644 --- a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java +++ b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java @@ -22,7 +22,6 @@ import static java.util.Objects.requireNonNull; -import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -106,19 +105,7 @@ private java.net.http.HttpClient defaultClient() { if (executor != null) { builder.executor(executor); } else if (Integer.getInteger("java.specification.version") >= 21) { - try { - ExecutorService virtualExecutorService = - (ExecutorService) - MethodHandles.lookup() - .findStatic( - Executors.class, - "newVirtualThreadPerTaskExecutor", - MethodType.methodType(ExecutorService.class)) - .invokeExact(); - builder.executor(virtualExecutorService); - } catch (Throwable t) { - // Impossible - } + builder.executor(virtualThreadExecutor()); } if (proxy != null) { builder.proxy(proxy); @@ -138,6 +125,17 @@ private java.net.http.HttpClient defaultClient() { return builder.build(); } + private static ExecutorService virtualThreadExecutor() { + try { + return (ExecutorService) + MethodHandles.lookup() + .findStatic(Executors.class, "newVirtualThreadPerTaskExecutor", MethodType.methodType(ExecutorService.class)) + .invokeExact(); + } catch (Throwable e) { + return null; + } + } + /** * Create a reasonable default BodyAdapter if avaje-jsonb or Jackson are present. */