Skip to content

Commit 7b437f1

Browse files
committed
make http client autocloseable
1 parent faef1c7 commit 7b437f1

File tree

4 files changed

+38
-4
lines changed

4 files changed

+38
-4
lines changed

http-client/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
<dependency>
6767
<groupId>io.avaje</groupId>
6868
<artifactId>avaje-http-api</artifactId>
69-
<version>2.9-SNAPSHOT</version>
69+
<version>${project.version}</version>
7070
<scope>test</scope>
7171
</dependency>
7272

http-client/src/main/java/io/avaje/http/client/DHttpClientContext.java

+16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.avaje.http.client;
22

3+
import java.lang.invoke.MethodHandles;
4+
import java.lang.invoke.MethodType;
35
import java.lang.reflect.Type;
46
import java.net.http.HttpHeaders;
57
import java.net.http.HttpRequest;
@@ -9,6 +11,7 @@
911
import java.util.List;
1012
import java.util.Map;
1113
import java.util.concurrent.CompletableFuture;
14+
import java.util.concurrent.ExecutorService;
1215
import java.util.concurrent.atomic.AtomicReference;
1316
import java.util.concurrent.atomic.LongAccumulator;
1417
import java.util.concurrent.atomic.LongAdder;
@@ -340,4 +343,17 @@ private String authToken() {
340343
String maxResponseBody(String body) {
341344
return body.length() > 1_000 ? body.substring(0, 1_000) + " <truncated> ..." : body;
342345
}
346+
347+
@Override
348+
public void close() {
349+
if (Integer.getInteger("java.specification.version") >= 21) {
350+
try {
351+
MethodHandles.lookup()
352+
.findVirtual(java.net.http.HttpClient.class, "close", MethodType.methodType(void.class))
353+
.invokeExact(httpClient);
354+
} catch (Throwable t) {
355+
throw new IllegalStateException("Failed to close java.net.http.HttpClient instance");
356+
}
357+
}
358+
}
343359
}

http-client/src/main/java/io/avaje/http/client/HttpClient.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.net.Authenticator;
44
import java.net.CookieHandler;
55
import java.net.ProxySelector;
6-
import java.net.http.HttpRequest;
76
import java.time.Duration;
87
import java.util.Map;
98
import java.util.concurrent.Executor;
@@ -33,7 +32,7 @@
3332
*
3433
* }</pre>
3534
*/
36-
public interface HttpClient {
35+
public interface HttpClient extends AutoCloseable {
3736

3837
/**
3938
* Return the builder to config and build the client context.
@@ -93,6 +92,19 @@ static Builder builder() {
9392
*/
9493
HttpClient.Metrics metrics(boolean reset);
9594

95+
/**
96+
* Note: invoking this method has no effect on JDK versions less than 21.
97+
*
98+
* <p>Initiates an orderly shutdown in which http requests previously submitted are run to
99+
* completion, but no new requests will be accepted. Running a request to completion may involve
100+
* running several operations in the background, including waiting for responses to be delivered.
101+
* This method waits until all operations have completed execution and the client has terminated.
102+
*
103+
* @see {@linkplain java.net.http.HttpClient#close}
104+
*/
105+
@Override
106+
void close();
107+
96108
/**
97109
* Builds the HttpClient.
98110
*

http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.avaje.http.generator.client;
22

3+
import io.avaje.http.generator.core.APContext;
34
import io.avaje.http.generator.core.BaseControllerWriter;
45
import io.avaje.http.generator.core.ControllerReader;
56
import io.avaje.http.generator.core.MethodReader;
@@ -62,12 +63,17 @@ private void writeMethods() {
6263
for (final ClientMethodWriter methodWriter : methodList) {
6364
methodWriter.write();
6465
}
66+
writer.append(" @Override").eol();
67+
writer.append(" public void close() {").eol();
68+
writer.append(" this.client.close();").eol();
69+
writer.append(" }").eol();
6570
}
6671

6772
private void writeClassStart() {
6873
writer.append(AT_GENERATED).eol();
6974
AnnotationUtil.writeAnnotations(writer, reader.beanType());
70-
writer.append("public class %s%s implements %s {", shortName, suffix, shortName).eol().eol();
75+
76+
writer.append("public class %s%s implements %s, AutoCloseable {", shortName, suffix, shortName).eol().eol();
7177

7278
writer.append(" private final HttpClient client;").eol().eol();
7379

0 commit comments

Comments
 (0)