我是反應式編程概念的新手,并試圖構建一個服務,該服務將請求并行發送到兩個后端服務并組合這些結果。這兩個后端服務具有不同的回應結構,我創建了一個映射器方法來將所有這些轉換為一個通用的回應結構。
這就是我現在所擁有的,當兩個服務都回傳結果時它正在作業。
public Mono<List<Response>> getRecords(String input){
List<Response> response = new ArrayList<>();
Mono<FirstApiResponse> gResp = this.firstWebClient.get().uri(uriBuilder -> uriBuilder
.path("/")
.queryParam("q", input)
.build()).retrieve()
.bodyToMono(FirstApiResponse.class).log()
.timeout(Duration.ofSeconds(50L));
Mono<SecondApiResponse> iResp = this.secondWebClient.get().uri(uriBuilder -> uriBuilder
.path("/search")
.queryParam("term", input)
.build()).retrieve()
.bodyToMono(SecondApiResponse.class).log().timeout(Duration.ofSeconds(50L));
return Mono.zip(firstResp,secResp).map(objects ->{
if(firstResp != null)
response.addAll(Mapper.convert(objects.getT1()));
if(secResp != null);
response.addAll(Mapper.convert(objects.getT2()));
return response;
});
}
public List<Response> convert(FirstApiResponse resp){
////
Mapping to Response object
////
return response;
}
public List<Response> convert(SecondApiResponse resp){
////
Mapping to Response object
////
return response;
}
我不知道這是否是正確的方法。此外,我想以這樣的方式進行處理,即如果該服務中的任何一個出現任何錯誤,那么它仍應回傳其他服務的結果。現在它拋出例外,我無法弄清楚如何正確處理它
如何以適當的方式處理這些錯誤?
uj5u.com熱心網友回復:
這是一個非常有效的場景,有很多方法可以處理它。一種粗略的方法是使用onErrorReturn您可以處理的新模型。它可以是一個空回應,也可以是您模型周圍的包裝器,以適合您的場景。
Mono<Wrapper<FirstApiResponse>> gResp = this.firstWebClient.get().uri(uriBuilder -> uriBuilder
.path("/")
.queryParam("q", input)
.build()).retrieve()
.bodyToMono(FirstApiResponse.class).log()
.map( response -> new Wrapper().withResponse(response))
.timeout(Duration.ofSeconds(50L))
.doOnError(throwable -> logger.error("Failed", throwable))
.onErrorReturn(new Wrapper().withError( YourDefaultErrorReponse(...));
Mono<SecondApiResponse> iResp = this.secondWebClient.get().uri(uriBuilder -> uriBuilder
.path("/search")
.queryParam("term", input)
.build())
.retrieve()
.bodyToMono(SecondApiResponse.class).log()
.map( response -> new Wrapper().withResponse(response))
.timeout(Duration.ofSeconds(50L))
..doOnError(throwable -> logger.error("Failed", throwable))
.onErrorReturn(new Wrapper().withError( YourDefaultErrorReponse(...))
還有一些方法可以回傳默認回應。一個簡單的方法是使用類似包裝器的東西
public final class Wrapper<T> {
private T response ;
private Error error;
public Wrapper<T> withResponse ( T response ){
this.response = response;
return this;
}
public Wrapper<T> withError( Error error) {
this.error = error;
return this;
}
public Boolean hasError(){
return error != null ;
}
public T getResponse(){
return response;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/336938.html
標籤:春天 反应式编程 弹簧-webflux 项目反应堆 spring-webclient
