在 Spring WebFlux 中,WebClient 提供了多種方式來設置響應超時。以下是幾種常見的方法:
1. 使用 HttpClient
設置響應超時
WebClient 的底層實現基于 Reactor Netty 的 HttpClient,可以通過 HttpClient 來設置響應超時。
java復制
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import java.time.Duration;
public class WebClientConfig {
public WebClient createWebClient() {
HttpClient httpClient = HttpClient.create()
.responseTimeout(Duration.ofSeconds(10)); // 設置響應超時為 10 秒
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
}
2. 使用 TcpClient
設置連接超時和響應超時
如果需要同時設置連接超時和響應超時,可以使用 TcpClient。
java復制
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.tcp.TcpClient;
import io.netty.channel.ChannelOption;
import io.netty.handler.timeout.ReadTimeoutHandler;
import io.netty.handler.timeout.WriteTimeoutHandler;
import java.time.Duration;
public class WebClientConfig {
public WebClient createWebClient() {
TcpClient tcpClient = TcpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) // 設置連接超時為 5 秒
.doOnConnected(connection ->
connection.addHandlerLast(new ReadTimeoutHandler(10)) // 設置讀取超時為 10 秒
.addHandlerLast(new WriteTimeoutHandler(10))); // 設置寫入超時為 10 秒
HttpClient httpClient = HttpClient.from(tcpClient)
.responseTimeout(Duration.ofSeconds(10)); // 設置響應超時為 10 秒
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
}
3. 使用 timeout
方法設置請求級超時
WebClient 的 timeout 方法可以用于設置特定請求的超時時間。
java復制
import org.springframework.web.reactive.function.client.WebClient;
import java.time.Duration;
public class WebClientTimeoutExample {
public static void main(String[] args) {
WebClient client = WebClient.builder()
.baseUrl("https://api.example.com")
.build();
client.get()
.uri("/data")
.retrieve()
.bodyToMono(String.class)
.timeout(Duration.ofMillis(5000)) // 設置請求級超時為 5 秒
.subscribe(System.out::println);
}
}
4. 使用 HttpClientRequest
設置請求級響應超時
如果需要在請求級別設置響應超時,可以使用 HttpClientRequest。
java復制
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.http.client.HttpClientRequest;
public class WebClientTimeoutExample {
public static void main(String[] args) {
WebClient client = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(HttpClient.create()))
.build();
client.get()
.uri("https://api.example.com/data")
.httpRequest(httpRequest -> {
HttpClientRequest reactorRequest = httpRequest.getNativeRequest();
reactorRequest.responseTimeout(Duration.ofSeconds(2)); // 設置請求級響應超時為 2 秒
})
.retrieve()
.bodyToMono(String.class)
.subscribe(System.out::println);
}
}
總結【起飛嘎嘎飛LSIXSO】
- 全局響應超時:通過 HttpClient 的 responseTimeout 方法設置。
- 連接超時:通過 TcpClient 的 option 方法設置。
- 讀取和寫入超時:通過 TcpClient 的 doOnConnected 方法添加 ReadTimeoutHandler 和 WriteTimeoutHandler。
- 請求級超時:通過 timeout 方法或 HttpClientRequest 的 responseTimeout 方法設置。
- 根據具體需求選擇合適的方法來設置 WebClient 的超時時間