簡體   English   中英

如何制作 Mono/Flux 鏈並在 sping-webflux 中實現 Retry

[英]How to make chain of Mono/Flux and implement Retry in sping-webflux

我有一個帶有反應/異步調用的場景。 我正在使用spring-boot-starter-webflux並使用webclient進行外部 HTTP 調用。 我的情況是我必須調用 callA(),然后檢查它的響應 ResponseA。 如果它的 ResponseA 沒問題,則退出並返回 ResponseA。 否則使用 ResponseA 創建第二個請求 requestB 並調用 callB()。 然后檢查它的響應ResponseB。 如果沒問題,則返回 ResponseA,否則在 callA() 上執行重試。

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

你只需要在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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM