Add support for specifying a read timeout for the reactive jdk client

See gh-32941
This commit is contained in:
Matteo Cristoforo
2024-06-03 14:05:28 +02:00
committed by Stéphane Nicoll
parent 7916f74942
commit 916ed5c0a9
2 changed files with 22 additions and 2 deletions

View File

@@ -21,6 +21,7 @@ import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.ByteBuffer;
import java.time.Duration;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
@@ -49,6 +50,9 @@ public class JdkClientHttpConnector implements ClientHttpConnector {
private DataBufferFactory bufferFactory = DefaultDataBufferFactory.sharedInstance;
@Nullable
private Duration readTimeout = null;
/**
* Default constructor that uses {@link HttpClient#newHttpClient()}.
@@ -91,12 +95,22 @@ public class JdkClientHttpConnector implements ClientHttpConnector {
this.bufferFactory = bufferFactory;
}
/**
* Set the default read timeout to use.
* <p>By default, this is null, so no read timeout will be set.</p>
*/
public void setReadTimeout(Duration readTimeout) {
Assert.notNull(readTimeout, "readTimeout is required");
this.readTimeout = readTimeout;
}
@Override
public Mono<ClientHttpResponse> connect(
HttpMethod method, URI uri, Function<? super ClientHttpRequest, Mono<Void>> requestCallback) {
JdkClientHttpRequest jdkClientHttpRequest = new JdkClientHttpRequest(method, uri, this.bufferFactory);
JdkClientHttpRequest jdkClientHttpRequest = new JdkClientHttpRequest(method, uri, this.bufferFactory,
this.readTimeout);
return requestCallback.apply(jdkClientHttpRequest).then(Mono.defer(() -> {
HttpRequest httpRequest = jdkClientHttpRequest.getNativeRequest();

View File

@@ -20,6 +20,7 @@ import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.nio.ByteBuffer;
import java.time.Duration;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Flow;
@@ -36,6 +37,7 @@ import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.MultiValueMap;
@@ -57,7 +59,8 @@ class JdkClientHttpRequest extends AbstractClientHttpRequest {
private final HttpRequest.Builder builder;
public JdkClientHttpRequest(HttpMethod httpMethod, URI uri, DataBufferFactory bufferFactory) {
public JdkClientHttpRequest(HttpMethod httpMethod, URI uri, DataBufferFactory bufferFactory,
@Nullable Duration readTimeout) {
Assert.notNull(httpMethod, "HttpMethod is required");
Assert.notNull(uri, "URI is required");
Assert.notNull(bufferFactory, "DataBufferFactory is required");
@@ -66,6 +69,9 @@ class JdkClientHttpRequest extends AbstractClientHttpRequest {
this.uri = uri;
this.bufferFactory = bufferFactory;
this.builder = HttpRequest.newBuilder(uri);
if (readTimeout != null) {
this.builder.timeout(readTimeout);
}
}