第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Spring WebFlux 的 webclient 在 Mono 上進行有條件的重復或重試

使用 Spring WebFlux 的 webclient 在 Mono 上進行有條件的重復或重試

白板的微信 2022-11-02 10:32:43
我想要做的是使用 webclient 對 Webflux 中的 Mono 進行有條件的重復。情況如下:我們有一些返回生成文檔的業(yè)務休息服務服務。此文檔的生成是由在此之前調(diào)用的另一個服務觸發(fā)的。但是,回到正題:文檔生成服務需要 10-30 秒。我們要做的是:在 10 秒后檢查是否生成了文檔(單聲道)。如果是這樣,一切都很好。如果沒有,請在 5 秒后重復(或重試)并檢查是否生成了文檔。依此類推,直到(最壞情況)30 秒后超時。這可能嗎?一些(偽)代碼:return this.webClient.post().uri(SERVICE_URL)).        body(BodyInserters.fromObject(docRequest)).retrieve().bodyToMono(Document.class).delaySubscription(Duration.ofSeconds(10)).repeat5TimesWithDynamicTimeDelayUntil(!document.isEmpty()).subscribe();
查看完整描述

1 回答

?
慕村9548890

TA貢獻1884條經(jīng)驗 獲得超4個贊

對的,這是可能的。

Mono有兩個重新訂閱的概念(因此,重新觸發(fā)請求)

  • retry = 如果上游完成異常,則重新訂閱

  • 如果上游成功完成, repeat = 重新訂閱

每個概念都有Mono針對不同用例的多個重載方法。尋找retry*repeat*方法。例如,要無延遲地重試最大次數(shù),請使用retry(int numRetries).

retryWhen通過和方法支持更復雜的用例repeatWhen,如以下示例所示。

重試時

如果單聲道以異常完成最多 5 次,每次嘗試之間間隔 5 秒,則重試:

// From reactor-core >= v3.3.4.RELEASE
import reactor.util.retry.Retry;this.webClient
        .post()
        .uri(SERVICE_URL)
        .body(BodyInserters.fromValue(docRequest))
        .retrieve()
        .bodyToMono(Document.class)
        .retryWhen(Retry.fixedDelay(5, Duration.ofSeconds(5)))
        .delaySubscription(Duration.ofSeconds(10))


重試構(gòu)建器支持其他退避策略(例如指數(shù))和其他選項以完全自定義重試。

請注意,retryWhen(Retry)上面使用的方法是在 reactor-core v3.3.4.RELEASE 中添加的,并且該retryWhen(Function)方法已被棄用。在 reactor-core v3.3.4.RELEASE 之前,您可以使用reactor-extras項目中的重試函數(shù)構(gòu)建器來創(chuàng)建一個Function傳遞給retryWhen(Function).

重復時

如果您需要在成功時重復,請使用.repeatWhenor.repeatWhenEmpty而不是.retryWhen上面的。

使用reactor-extras項目中的repeat 函數(shù)構(gòu)建器來創(chuàng)建repeat Function,如下所示:

// From reactor-extras

import reactor.retry.Repeat;


this.webClient

        .post()

        .uri(SERVICE_URL)

        .body(BodyInserters.fromValue(docRequest))

        .retrieve()

        .bodyToMono(Document.class)

        .filter(document -> !document.isEmpty())

        .repeatWhenEmpty(Repeat.onlyIf(repeatContext -> true)

                .exponentialBackoff(Duration.ofSeconds(5), Duration.ofSeconds(10))

                .timeout(Duration.ofSeconds(30)))

        .delaySubscription(Duration.ofSeconds(10))

如果您想在成功或失敗時重新訂閱,也可以將 a.retry*與 a鏈接。.repeat*


查看完整回答
反對 回復 2022-11-02
  • 1 回答
  • 0 關注
  • 504 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號