如何在 Spring 中等待 WebClient 超时响应?

How to wait for WebClient response on timeout in Spring?

我有一个 WebClient,我想在某个 timeout 后停止并提供回退值。

webClient.post()
    .uri(path)
    .bodyValue(body)
    .retrieve()
    .bodyToMono(type)
    .timeout(Duration.ofSeconds(15))
    .onErrorResume(ex -> Mono.just(provideFallbackValue())); //not only timeout, but any failure

无论如何,我想在 TimeoutException 的情况下继续等待另一个后台线程中的响应(至少让我们说再等 60 秒),并且仍然处理响应然后异步。

这可能吗?

你能做的就是改变这段代码的视角。不要在另一个线程中等待额外的 60 秒,而是立即启动新线程并异步工作。

如果第二个线程的回答在 15 秒或更短时间内到达,您可以立即回复。否则,发送与错误相关的消息,但在 60 秒之前您仍然处于通话状态。


这是一个可以做到这一点的代码:

private Future<YourClass> asyncCall() {
    ...
    // Put here the async call with a timeout of 60 seconds
    // This call can be sync because you are already in a secondary thread
}


// Main thread
try {
    Future<YourClass> future = executors.submit(() -> asyncCall());
    YourClass result = future.get(15, TimeUnit.SECOND);
    // Result received in less than 15 seconds
} catch (TimeoutException e) {
    // Handle timeout of 15 seconds
}