当前位置: 首页 > 知识库问答 >
问题:

如何制作Mono/Flux链并在sping-webflow中实现Retry

江英华
2023-03-14

我有一个无功/异步调用的场景。我正在使用sping-boot-starter-webflow并使用webClient进行外部HTTP调用。我的场景是,我必须打电话给call A(),然后检查它的响应响应。如果它的响应是确定比退出并返回响应。否则,创建第二个请求请求B使用响应A和打一个调用到calB()。然后检查其响应响应。如果它是确定的,然后返回响应,否则doRetry on call A()。

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.
}

共有1个答案

鲍建业
2023-03-14

您只需要在平面图中执行一些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);
}

 类似资料:
  • 我有一个应该向用户发送电子邮件的用例。首先,我创建电子邮件正文。 然后我选择用户并向他们发送电子邮件: 我不喜欢什么 没有cache()方法,emailBody Mono会在每个迭代步骤中进行计算 要获得emailBody值,我使用emailBody。block(),但可能有一种反应方式,而不是在通量流中调用block方法

  • 我写了一个@Aspect来拦截以Mono/Flux返回值的被动方法。使用@AfterReturning advice,我试图通过调用webservice发出APNS通知。 不幸的是,processNotification Mono服务在没有执行调用链的情况下立即返回onComplete信号。下面是我的示例程序。 我们如何在不等待侦听的情况下异步触发此调用。。目前,processNotificati

  • 更新: 一点我想要实现的内容。我有两个服务--一个通过Http返回me,另一个通过Redis返回。对于这两种情况,我有完全相同的功能-10-15个操作符链,我想要实现的是避免重复代码。 例如:

  • 如何将flux 转换为mono 对象?

  • 我是Reactor编程新手,需要MONO/Flux方面的帮助 我有POJO课程 受雇者Java语言 我在访问服务时返回了Mono,我需要从Mono中提取名称作为字符串。 但这再次返回Mono而不是字符串。我需要从这个Mono中提取String值。

  • 下一个metod在TokenService类中。