WebClient 的 timeout 方法用于設(shè)置特定請求的超時時間。這個方法非常有用,特別是在處理可能需要較長時間才能完成的網(wǎng)絡(luò)請求時。通過設(shè)置超時時間,可以避免應(yīng)用程序無限期地等待響應(yīng),從而提高應(yīng)用程序的響應(yīng)性和可靠性。
使用 timeout
方法【起飛嘎嘎飛LSIXSO】
timeout 方法可以應(yīng)用于 Mono 和 Flux,分別用于單個響應(yīng)和多個響應(yīng)的超時設(shè)置。以下是一些具體的使用示例:
一、設(shè)置請求級超時
(一)單個響應(yīng)的超時設(shè)置
如果你的請求返回單個響應(yīng)(例如,使用 bodyToMono),可以使用 timeout 方法設(shè)置超時時間。
java復(fù)制
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)) // 設(shè)置請求級超時為 5 秒
.subscribe(
response -> System.out.println("Response: " + response),
error -> System.err.println("Error: " + error.getMessage())
);
}
}
(二)多個響應(yīng)的超時設(shè)置
如果你的請求返回多個響應(yīng)(例如,使用 bodyToFlux),同樣可以使用 timeout 方法設(shè)置超時時間。
java復(fù)制
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)) // 設(shè)置請求級超時為 5 秒
.subscribe(
response -> System.out.println("Response: " + response),
error -> System.err.println("Error: " + error.getMessage())
);
}
}
二、全局超時設(shè)置
雖然 timeout 方法主要用于請求級超時設(shè)置,但你也可以通過配置 HttpClient 來設(shè)置全局超時時間。這適用于所有通過 WebClient 發(fā)起的請求。
java復(fù)制
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)); // 設(shè)置全局響應(yīng)超時為 10 秒
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
}
三、注意事項
(一)超時時間的單位
timeout 方法接受一個 Duration 對象,可以使用 Duration.ofSeconds、Duration.ofMillis 等方法來指定超時時間的單位。
(二)超時后的行為
當(dāng)超時發(fā)生時,timeout 方法會拋出一個 TimeoutException。你可以在 subscribe 方法中處理這個異常,例如記錄日志或返回默認(rèn)值。
(三)結(jié)合其他操作符
timeout 方法可以與其他操作符結(jié)合使用,例如 onErrorResume 或 onErrorReturn,以實現(xiàn)更復(fù)雜的錯誤處理邏輯。
java復(fù)制
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())
);
四、總結(jié)
WebClient 的 timeout 方法提供了一種簡單而強大的方式來設(shè)置請求級超時。通過設(shè)置超時時間,可以避免應(yīng)用程序無限期地等待響應(yīng),從而提高應(yīng)用程序的響應(yīng)性和可靠性。你可以根據(jù)具體需求選擇合適的超時時間,并結(jié)合其他操作符實現(xiàn)更復(fù)雜的錯誤處理邏輯。