Add support for specifying a read timeout for the reactive jdk client
See gh-32941
This commit is contained in:
committed by
Stéphane Nicoll
parent
7916f74942
commit
916ed5c0a9
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user