首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何制作Mono/Flux链并在sping中实现重试

如何制作Mono/Flux链并在sping中实现重试
EN

Stack Overflow用户
提问于 2020-10-11 23:29:05
回答 1查看 472关注 0票数 0

我有一个使用反应性/异步调用的场景。我使用spring-boot-starter-webfluxwebclient进行外部HTTP调用。我的场景是,我必须调用callA(),然后检查它的响应ResponseA。如果它的ResponseA没有问题,那么退出并返回ResponseA。否则,使用requestB创建第二个请求ResponseA,并调用callB()。然后检查它的响应ResponseB。如果它是确定的,那么返回ResponseA,否则在callA()上返回doRetry。

代码语言:javascript
复制
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.
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-12 13:23:20

您只需在flatMap中执行一些if-语句即可。可能把它分成一些更好的功能名称等等。没有订阅,没有阻塞。

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64309989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档