Created
September 19, 2024 11:34
-
-
Save joshlong/bcd000bd8525df0e4375aef9284e5c6e to your computer and use it in GitHub Desktop.
dynamically set the timeout for each request
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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