diff --git a/http-client/pom.xml b/http-client/pom.xml index 7c4d993b..96a77d09 100644 --- a/http-client/pom.xml +++ b/http-client/pom.xml @@ -1,5 +1,7 @@ - + 4.0.0 io.avaje @@ -95,66 +97,48 @@ - - - org.apache.maven.plugins - maven-jar-plugin - 3.5.0 - - - - true - - - - - + org.apache.maven.plugins maven-compiler-plugin - 3.14.1 + + + + io.avaje + avaje-inject-generator + 12.0 + + + - default-testCompile - - - - io.avaje - avaje-inject-generator - 12.0 - - - - - - - base - - compile - - - 11 - - ${project.basedir}/src/main/java - - - - - - java21 + compile-java-21 + compile compile 21 - ${project.basedir}/src/main/java21 + + ${project.basedir}/src/main/java21 - ${project.build.outputDirectory}/META-INF/versions/21 + true + + org.apache.maven.plugins + maven-jar-plugin + + + + true + + + + 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 460f9057..9ce3b450 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 @@ -1,7 +1,5 @@ package io.avaje.http.client; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; import java.net.Authenticator; import java.net.CookieHandler; import java.net.CookieManager; @@ -15,8 +13,6 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.function.Function; import javax.net.ssl.SSLContext; @@ -55,8 +51,7 @@ final class DHttpClientBuilder implements HttpClient.Builder, HttpClient.Builder private final Set suppressed = new HashSet<>(); private void configureRetryHandler(BeanScope beanScope) { - beanScope.getOptional(RetryHandler.class) - .ifPresent(this::setRetryHandler); + beanScope.getOptional(RetryHandler.class).ifPresent(this::setRetryHandler); } private void setRetryHandler(RetryHandler retryHandler) { @@ -108,8 +103,8 @@ private java.net.http.HttpClient defaultClient() { } if (executor != null) { builder.executor(executor); - } else if (Integer.getInteger("java.specification.version") >= 21) { - builder.executor(virtualThreadExecutor()); + } else if (Runtime.version().feature() >= 21) { + builder.executor(JDK21Functions.getExecutor()); } if (proxy != null) { builder.proxy(proxy); @@ -129,17 +124,6 @@ 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. */ @@ -192,8 +176,7 @@ private DHttpClientContext buildClient() { buildIntercept()); } - DHttpClientBuilder() { - } + DHttpClientBuilder() {} @Override public HttpClient.Builder client(java.net.http.HttpClient client) { @@ -377,5 +360,4 @@ public Duration requestTimeout() { public RetryHandler retryHandler() { return retryHandler; } - } diff --git a/http-client/src/main/java/io/avaje/http/client/DHttpClientContext.java b/http-client/src/main/java/io/avaje/http/client/DHttpClientContext.java index fc59922c..ee291ccf 100644 --- a/http-client/src/main/java/io/avaje/http/client/DHttpClientContext.java +++ b/http-client/src/main/java/io/avaje/http/client/DHttpClientContext.java @@ -2,8 +2,6 @@ import io.avaje.applog.AppLog; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; import java.lang.reflect.Type; import java.net.http.HttpHeaders; import java.net.http.HttpRequest; @@ -124,9 +122,8 @@ public HttpClient.Metrics metrics() { public HttpClient.Metrics metrics(boolean reset) { if (reset) { return new DMetrics(metricResTotal.sumThenReset(), metricResError.sumThenReset(), metricResBytes.sumThenReset(), metricResMicros.sumThenReset(), metricResMaxMicros.getThenReset()); - } else { - return new DMetrics(metricResTotal.sum(), metricResError.sum(), metricResBytes.sum(), metricResMicros.sum(), metricResMaxMicros.get()); } + return new DMetrics(metricResTotal.sum(), metricResError.sum(), metricResBytes.sum(), metricResMicros.sum(), metricResMaxMicros.get()); } void metricsString(int stringBody) { @@ -395,14 +392,6 @@ String maxResponseBody(String body) { @Override public void close() { this.closed = true; - if (Integer.getInteger("java.specification.version") >= 21) { - try { - MethodHandles.lookup() - .findVirtual(java.net.http.HttpClient.class, "close", MethodType.methodType(void.class)) - .invokeExact(httpClient); - } catch (Throwable t) { - throw new IllegalStateException("Failed to close java.net.http.HttpClient instance"); - } - } + JDK21Functions.closeClient(httpClient); } } diff --git a/http-client/src/main/java/io/avaje/http/client/JDK21Functions.java b/http-client/src/main/java/io/avaje/http/client/JDK21Functions.java new file mode 100644 index 00000000..93925d90 --- /dev/null +++ b/http-client/src/main/java/io/avaje/http/client/JDK21Functions.java @@ -0,0 +1,18 @@ +package io.avaje.http.client; + +import java.net.http.HttpClient; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +final class JDK21Functions { + private JDK21Functions() {} + + // only executed in tests + static ExecutorService getExecutor() { + return Executors.newCachedThreadPool(); + } + + static void closeClient(HttpClient client) { + // no-op + } +} diff --git a/http-client/src/main/java21/io/avaje/http/client/JDK21Functions.java b/http-client/src/main/java21/io/avaje/http/client/JDK21Functions.java new file mode 100644 index 00000000..cd246253 --- /dev/null +++ b/http-client/src/main/java21/io/avaje/http/client/JDK21Functions.java @@ -0,0 +1,17 @@ +package io.avaje.http.client; + +import java.net.http.HttpClient; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +final class JDK21Functions { + private JDK21Functions() {} + + static ExecutorService getExecutor() { + return Executors.newVirtualThreadPerTaskExecutor(); + } + + static void closeClient(HttpClient client) { + client.close(); + } +}