WebClient 的 timeout 方法用于设置特定请求的超时时间。这个方法非常有用,特别是在处理可能需要较长时间才能完成的网络请求时。通过设置超时时间,可以避免应用程序无限期地等待响应,从而提高应用程序的响应性和可靠性。
使用 timeout
方法【起飞嘎嘎飞LSIXSO】
timeout 方法可以应用于 Mono 和 Flux,分别用于单个响应和多个响应的超时设置。以下是一些具体的使用示例:
一、设置请求级超时
(一)单个响应的超时设置
如果你的请求返回单个响应(例如,使用 bodyToMono),可以使用 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.ofSeconds(5)) // 设置请求级超时为 5 秒
.subscribe(
response -> System.out.println("Response: " + response),
error -> System.err.println("Error: " + error.getMessage())
);
}
}
(二)多个响应的超时设置
如果你的请求返回多个响应(例如,使用 bodyToFlux),同样可以使用 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()
.bodyToFlux(String.class)
.timeout(Duration.ofSeconds(5)) // 设置请求级超时为 5 秒
.subscribe(
response -> System.out.println("Response: " + response),
error -> System.err.println("Error: " + error.getMessage())
);
}
}
二、全局超时设置
虽然 timeout 方法主要用于请求级超时设置,但你也可以通过配置 HttpClient 来设置全局超时时间。这适用于所有通过 WebClient 发起的请求。
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();
}
}
三、注意事项
(一)超时时间的单位
timeout 方法接受一个 Duration 对象,可以使用 Duration.ofSeconds、Duration.ofMillis 等方法来指定超时时间的单位。
(二)超时后的行为
当超时发生时,timeout 方法会抛出一个 TimeoutException。你可以在 subscribe 方法中处理这个异常,例如记录日志或返回默认值。
(三)结合其他操作符
timeout 方法可以与其他操作符结合使用,例如 onErrorResume 或 onErrorReturn,以实现更复杂的错误处理逻辑。
java复制
client.get()
.uri("/data")
.retrieve()
.bodyToMono(String.class)
.timeout(Duration.ofSeconds(5))
.onErrorResume(e -> Mono.just("Default response"))
.subscribe(
response -> System.out.println("Response: " + response),
error -> System.err.println("Error: " + error.getMessage())
);
四、总结
WebClient 的 timeout 方法提供了一种简单而强大的方式来设置请求级超时。通过设置超时时间,可以避免应用程序无限期地等待响应,从而提高应用程序的响应性和可靠性。你可以根据具体需求选择合适的超时时间,并结合其他操作符实现更复杂的错误处理逻辑。