HttpClient Send Method Guaranteed Completion
Daniel Fuchs
daniel.fuchs at oracle.com
Wed Oct 6 18:46:15 UTC 2021
Hi Eliot,
On 06/10/2021 18:22, Elliot Barlas wrote:
> Thanks for the reply, Daniel.
>
> This was an HTTP 1.1 connection. The code snippet for building the URL
> and configuring the HttpClient was included in my previous email for
> reference.
>
> I can't make any claims about what was happening with packet
> transmissions at the network level. It's entirely possible that the
> destination maintained the TCP connection over an extended period
> without fulfilling its obligation to send the body. But there must be a
> way to guarantee completion for such scenarios. This was the function of
> socket timeouts in the world of synchronous network APIs. In this new
> asynchronous world, it looks like that might have been forgotten.
>
> The alternative timeout code you mentioned addresses the problem in a
> narrow sense, but it results in a resource leak. If the HTTP session is
> abandoned at the application level via CompletableFuture timed wait,
> there is still a footprint within HttpClient. Over time, socket handles,
> callback objects, and other resources can accumulate with no visibility
> to application code.
There should be no leak if you call CompletableFuture::cancel when
catching the TimeoutException as shown in my suggestion, and provided
you're on a recent JDK (16+). That should take care of reclaiming
all the resources linked to the exchange.
(that was taken care of by https://bugs.openjdk.java.net/browse/JDK-8245462)
If we had to implement a global timeout that's how we would do
it internally.
best regards,
-- daniel
More information about the net-dev
mailing list