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