2

I'm using the new java.net.http.HttpClient and from my tests after about 378026 times of calling it, I start to get the following:

Caused by: java.net.ConnectException: Cannot assign requested address
        at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:964)
        at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:179)
        at java.net.http/jdk.internal.net.http.AsyncSSLConnection.connectAsync(AsyncSSLConnection.java:56)
        at java.net.http/jdk.internal.net.http.Http2Connection.createAsync(Http2Connection.java:369)
        at java.net.http/jdk.internal.net.http.Http2ClientImpl.getConnectionFor(Http2ClientImpl.java:127)
        at java.net.http/jdk.internal.net.http.ExchangeImpl.get(ExchangeImpl.java:88)
        at java.net.http/jdk.internal.net.http.Exchange.establishExchange(Exchange.java:293)
        at java.net.http/jdk.internal.net.http.Exchange.responseAsyncImpl0(Exchange.java:425)
        at java.net.http/jdk.internal.net.http.Exchange.responseAsyncImpl(Exchange.java:330)
        at java.net.http/jdk.internal.net.http.Exchange.responseAsync(Exchange.java:322)
        at java.net.http/jdk.internal.net.http.MultiExchange.responseAsyncImpl(MultiExchange.java:304)
        at java.net.http/jdk.internal.net.http.MultiExchange.lambda$responseAsync0$2(MultiExchange.java:250)
        at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
        at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
        at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1705)
        at java.net.http/jdk.internal.net.http.HttpClientImpl$DelegatingExecutor.execute(HttpClientImpl.java:153)
        at java.base/java.util.concurrent.CompletableFuture.completeAsync(CompletableFuture.java:2591)
        at java.net.http/jdk.internal.net.http.MultiExchange.responseAsync(MultiExchange.java:204)
        at java.net.http/jdk.internal.net.http.HttpClientImpl.sendAsync(HttpClientImpl.java:632)

Below is the class that I use:

public class JavaHttpClient {
    HttpClient httpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(30))
            .followRedirects(HttpClient.Redirect.ALWAYS).build();

    public String getRequest(String incomingUrl) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder().uri(URI.create(incomingUrl)).GET().build();
        HttpResponse<String> response = httpClient.send(request, BodyHandlers.ofString());

        return response.body();
    }

}

I don't understand why this is happening. I assume something is being left open that should have been closed?

Lii
  • 11,553
  • 8
  • 64
  • 88
Arya
  • 8,473
  • 27
  • 105
  • 175

1 Answers1

0

The HttpClient will close all opened connections when it's no longer referenced and there's no operations in progress (all responses have been received).

daniel
  • 2,665
  • 1
  • 8
  • 18
  • 1
    I don't find any of that stated in the documentation. More likely it will close opened connections according to an internal and undefined connection-pooling scheme. – user207421 Jun 06 '19 at 08:49
  • HTTP/1.1 connection are closed after the keep-alive timeout occur. But all remaining opened connections in the HTTP/1.1 and HTTP/2 pools will also be closed as stated above. – daniel Jun 06 '19 at 11:22