本文介紹了如何防止Mono被取消?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在嘗試將某些內容實現為爭用條件。此爭用條件必須遵循以下情況:
同時啟動兩個HTTP調用。
返回成功完成的第一個調用的響應。
處理最后一個調用。(這里最重要的是,我不能丟棄最后一個呼叫,我確實需要處理它的結果:無論它的狀態、成功或失敗)。
此代碼示例是我所實現的最接近的解決方案:
Mono<StatusMock> monoA = webClient.get()
.uri("https://some.url.a")
.retrieve()
.bodyToMono(StatusMock.class)
.subscribeOn(Schedulers.boundedElastic());
Mono<StatusMock> monoB = webClient.get()
.uri("https://some.url.b")
.retrieve()
.bodyToMono(StatusMock.class)
.doOnSuccess(this::verifyBody)
.onErrorStop()
.subscribeOn(Schedulers.boundedElastic());
StatusMock statusMock = Flux.first(monoA, monoB)
.blockFirst();
if (statusMock != null) {
return statusMock.getStatus();
}
return "empty";
}
private void verifyBody(StatusMock statusMock) {
if (statusMock.getStatus().contains("error")) {
log.error("throwing an exception");
throw new RuntimeException("error");
}
}
public class StatusMock {
private String status; // getters and setters implicit
}
在本例中,我使用了Flos.first方法,它對我返回第一個調用有很大幫助,但它會丟棄(取消)第二個調用,這是一個問題,因為我還需要最后一個調用的結果。
這個邏輯有什么解決方案嗎?這里我使用的是Spring Project Reader,但我接受任何可以幫助我解決這種情況的庫或框架。
推薦答案
您可以在Mono
上使用cache
運算符來防止它們被取消:
Mono<StatusMock> monoA = webClient.get()
// ...
.cache();
Mono<StatusMock> monoB = webClient.get()
// ...
.cache();
Mono.firstWithSignal(monoA, monoB);
這篇關于如何防止Mono被取消?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,