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 方法提供了一種簡單而強大的方式來設置請求級超時。通過設置超時時間,可以避免應用程序無限期地等待響應,從而提高應用程序的響應性和可靠性。你可以根據具體需求選擇合適的超時時間,并結合其他操作符實現更復雜的錯誤處理邏輯。