如何在 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
}
我有一个 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
}