使用 Polly 實現複雜策略 超時重試

2022-02-10 12:11:23 字數 1182 閱讀 9114

第一次接觸 polly 還是在做某個微服務系統的時候,那時只會使用單一的超時策略與重試策略,更加高階的特性就沒有再進行學習了。最近開為某個客戶開發 pc 端的上位機的時候,客戶有個需求,在發起請求之後如果 5 秒鐘沒有響應則進行重試,總共可以重試 3 次,如果 3 次請求都未返回資料,就視為請求失敗。

即可,國內也有很多優秀的介紹文章,例如這篇這篇

查閱了 polly 的官方文件之後,發現 polly 提供了策略組合功能,每個 policy 例項都可以呼叫其wrap()方法與另外乙個策略進行組合。

或者是通過policy靜態類提供的warp()靜態方法來指定需要組合的兩個策略。

根據需求描述來看,我們需要用到超時策略和重試策略,只要將其組合即可。不過這裡需要注意乙個坑,即他們的組合順序。

正確的組合順序應該是 **重試策略.warp(超時策略) **,而不是超時策略.warp(重試策略)。這是因為在超時之後 polly 會丟擲timeoutrejectedexception異常,在重試策略捕獲到該異常之後,就會開始重試操作,即後面組合策略的executeasync()方法接收的委託。

首先我們定義乙個方法,該方法用於組合策略(超時+重試),因為我這裡是傳入的非同步委託操作,所以返回的是asyncpolicy物件。

private asyncpolicywrap buildtimeoutretrypolicy(string msg)

); return retrypolicy.wrapasync(timeoutpolicy);

}

定義好策略之後,就是我們的實際應用了。這裡說明一下執行邏輯,當第一次請求的時候如果發生了超時的情況,則進入重試策略,重試兩次,當最後一次仍然丟擲timeoutrejectedexception異常,則重試策略不再捕獲,直接將異常丟擲給呼叫者。

private async taskgetresult(asyncpolicywrap policy)

catch (timeoutrejectedexception)

}

使用訊號實現超時

訊號是軟體中斷,能夠提供一種處理非同步事件的方法。這些訊號被定義在signal.h中,列表如下 define sighup 1 hangup posix define sigint 2 interrupt ansi define sigquit 3 quit posix define sigill ...

使用延時策略實現彈性滑動

延時策略。它的核心思想是通過傳送一系列延時訊息從而打到一種漸進式的效果 採用handler的乙個例項。功能 大約1000ms內將view的內容向左移動100px.private static final int message scroll to 1 private static final int...

使用SNAT DNAT策略實現閘道器應用

實驗環境 公司的閘道器伺服器使用rhel5系統,其eth0網 過光纖接入internet,eth1網絡卡連線區域網路。由於只註冊了乙個公網ip位址,需要在閘道器伺服器上進行配置,使位於區域網內的員工可以通過共享的方式訪問internet。另外,還需要將內網的web伺服器在internet上發布,作為...