Skip to content

Instantly share code, notes, and snippets.

@joshlong
Created September 19, 2024 11:34
Show Gist options
  • Save joshlong/bcd000bd8525df0e4375aef9284e5c6e to your computer and use it in GitHub Desktop.
Save joshlong/bcd000bd8525df0e4375aef9284e5c6e to your computer and use it in GitHub Desktop.
dynamically set the timeout for each request
package org.springframework.http.client;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.http.HttpMethod;
import org.springframework.util.Assert;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.time.Duration;
import java.util.concurrent.Executor;
//
// DynamicDurationClientHttpRequestFactory.timeout(10000);
//
// http
// .get()
// .uri("https://httpbin.org/delay/1")
// .retrieve()
// .body(String.class);
//
public class DynamicDurationClientHttpRequestFactory
extends JdkClientHttpRequestFactory {
private final HttpClient http;
private final Executor executor;
public DynamicDurationClientHttpRequestFactory() {
this(HttpClient.newHttpClient());
}
public DynamicDurationClientHttpRequestFactory(HttpClient httpClient) {
Assert.notNull(httpClient, "HttpClient is required");
this.http = httpClient;
this.executor = httpClient.executor().orElseGet(SimpleAsyncTaskExecutor::new);
}
public DynamicDurationClientHttpRequestFactory(HttpClient httpClient, Executor executor) {
this.http = httpClient;
this.executor = executor;
}
private static final ThreadLocal<Long> counter = ThreadLocal.withInitial(() -> 0L);
public static void timeout(long timeout) {
counter.set(timeout);
}
@Override
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
var intValue = counter.get().intValue();
System.out.println("timeout=" + intValue);
return new JdkClientHttpRequest(this.http, uri, httpMethod,
this.executor, Duration.ofMillis(counter.get().intValue()));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment