我有一个使用反应性/异步调用的场景。我使用spring-boot-starter-webflux和webclient进行外部HTTP调用。我的场景是,我必须调用callA(),然后检查它的响应ResponseA。如果它的ResponseA没有问题,那么退出并返回ResponseA。否则,使用requestB创建第二个请求ResponseA,并调用callB()。然后检查它的响应ResponseB。如果它是确定的,那么返回ResponseA,否则在callA()上返回doRetry。
public Mono<ResponseA> callA(Request1 requestA) {
// calling service-A using webclient
}
public Flux<ResponseB> callB(Request2 requestB) {
// calling service-B using webclient but to create requestB, I need ResponseA.
}发布于 2020-10-12 13:23:20
您只需在flatMap中执行一些if-语句即可。可能把它分成一些更好的功能名称等等。没有订阅,没有阻塞。
callA(createNewRequest()).flatMap(response1 -> {
// Validate response
if(!isValidResponse(response)) {
// if failed validation, create new request and do a new call
var request = buildRequest(response);
return callB(request).flatMap(response2 -> {
// validate second response
if(!isValidResponse(response2)) {
// failed validation return the first response.
return Mono.just(response1)
}
// otherwise recursively call again
return callA(createNewRequest()); // Warning this can be an infinite loop
}
}
// Validation passed
return Mono.just(response);
}https://stackoverflow.com/questions/64309989
复制相似问题