.Net彈性和瞬態(tài)故障處理庫Polly實(shí)現(xiàn)執(zhí)行策略
執(zhí)行策略
執(zhí)行策略的常見方式是調(diào)用策略的Execute函數(shù)
var policy = Policy.Handle<TimeoutException>().Retry(); policy.Execute(DoSomething);
返回值:
如果有返回值,它也是可以獲取其返回值的:
var result = policy.Execute(DoSomething);
捕獲異常:
如果在策略的執(zhí)行過程中出現(xiàn)了異常,也會(huì)在該函數(shù)中同步拋出來,和直接執(zhí)行該委托行為一致??梢灾苯油ㄟ^try-catch處理。
try
{
policy.Execute(DoSomething);
}
catch (Exception e)
{
throw;
}也可以通過ExecuteAndCapture函數(shù)捕獲異常。
var result = policy.ExecuteAndCapture(DoSomething);
if (result.FaultType == null)
{
Console.WriteLine(result.Result);
}策略上下文
在策略的處理過程中,有一個(gè)上下文對(duì)象,可以在回調(diào)函數(shù)中使用:
public static RetryPolicy Retry(this PolicyBuilder policyBuilder, int retryCount, Action<Exception, int, Context> onRetry);
它是一個(gè)IDictionary<string, object>類型的對(duì)象,它在Policy的執(zhí)行過程中都可以使用,如:
Policy.Handle<TimeoutException>().Retry(3, (err, countDown, context) =>
{
var method = context["method"];
ConsoleLogger.WriteLine(method);
})這個(gè)上下文對(duì)象可以在應(yīng)用策略的時(shí)候帶入:
policy.Execute(DoSomething, new Context("context")
{
["method"] = "PolicyTest"
});依賴注入
Polly也自帶了一個(gè)簡(jiǎn)單的DI框架,方便復(fù)用Policy,使用方式如下:
var registry = new PolicyRegistry();
registry.Add("timeout & retry", Policy.Handle<TimeoutException>().Retry(3));
var policy = registry.Get<ISyncPolicy>("timeout & retry");
policy.Execute(DoSomething);當(dāng)然,也可以使用Autofac等自己喜歡的方式。
線程安全
Policy本身是線程安全的,可以并發(fā)使用同一個(gè)Policy,但如果Policy中執(zhí)行的委托有多線程問題,仍然會(huì)出現(xiàn)異常。
異步的支持
Policy對(duì)異步操作也提供了良好的支持,只需要使用相應(yīng)以Async結(jié)尾的函數(shù)即可。
var policy = Policy.Handle<TimeoutException>().RetryAsync(3); await policy.ExecuteAsync(DoSomethingAsync);
PS:有的不需要(也沒有)以Async的函數(shù),如Handle
同步上下文
對(duì)于有的異常處理,如果需要同步上下文,則需要在ExecuteAsync函數(shù)中設(shè)置continueOnCapturedContext參數(shù)為false。
var policy = Policy.Handle<TimeoutException>().RetryAsync(3); await policy.ExecuteAsync(DoSomethingAsync, CancellationToken.None, continueOnCapturedContext: true);
Cancellation的支持
Polly也支持系統(tǒng)的co-operative cancellation框架,在重試,超時(shí),bulkhead等策略中通知執(zhí)行的委托,從而影響其行為。要使用Cancellation,需要在Excute的時(shí)候傳入CancellationToken。
policy.Execute(ct =>
{
ct.ThrowIfCancellationRequested();
}, cts.Token);具體示例在介紹彈性策略的超時(shí)策略時(shí)有介紹到。
到此這篇關(guān)于Polly實(shí)現(xiàn)執(zhí)行策略的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談.Net Core后端單元測(cè)試的實(shí)現(xiàn)
這篇文章主要介紹了淺談.Net Core后端單元測(cè)試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
RadioButtonList綁定圖片及泛型Dictionary應(yīng)用
讀取站點(diǎn)某一目錄的圖片,需要掌握LINQ與泛型Dictionary<TKey,TValue>的使用,本文將介紹RadioButtonList綁定圖片的實(shí)現(xiàn),感興趣的朋友可以了解下,或許對(duì)你有所幫助2013-02-02
ASP.NET 修復(fù) IIS 映射具體實(shí)現(xiàn)步驟
本文主要介紹IIS映射的具體步驟,希望對(duì)大家有所幫助。2016-05-05
Asp.net core Web Api配置swagger中文的實(shí)現(xiàn)
swagger是一個(gè)api文檔自動(dòng)生動(dòng)工具,還集成了在線調(diào)試. 可以為項(xiàng)目自動(dòng)生成接口文檔, 非常的方便快捷,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
repeater隔行換色與鼠標(biāo)停留在上面達(dá)到變色效果
鼠標(biāo)停留在上面是變成其他的顏色,很多新手朋友都想實(shí)現(xiàn)這種效果,可是無從下手,本文整理了一些解決技巧,感興趣的朋友可以參考下啊2013-01-01
解決AJAX.NET中的懸停panel在頁面加載時(shí)閃爍的問題
AJAX.NET的兩個(gè)懸??丶?分別是HoverMenuExtender和ModalPopupExtender.他們可以打造很好的懸停效果...通常,我都是用panel來作為懸停內(nèi)容的容器..2009-06-06

