在 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 的超时时间