【发布时间】:2015-06-26 05:38:37
【问题描述】:
我一直在为受限制的 DocumentDB 客户端调用编写非常冗长的重试逻辑。
下面的例子是一个常见的例子,重试了 10 次。
我的问题有两个: 这是最佳实践吗,是否有一种不那么冗长的方法来处理这个问题?我看到有一个 Microsoft.Azure.Documents.Client.TransientFaultHandling nuget 包应该可以用更少的代码实现相同的结果,但是我在 StackOverflow 或 Google 上找不到任何示例,并且没有似乎是 Microsoft 提供的任何明确文档。
int maxRetryAttempts = 10;
while (maxRetryAttempts > 0)
{
try
{
// Attempt to call DocumentDB Method
// ---[DocumentDB Method Here]---
}
catch (DocumentClientException de)
{
if (de.StatusCode.HasValue)
{
var statusCode = (int)de.StatusCode;
if (statusCode == 429 || statusCode == 503)
{
//Sleep for retry amount
Thread.Sleep(de.RetryAfter);
//Decrement max retry attempts
maxRetryAttempts--;
}
}
}
catch (AggregateException ae)
{
foreach (Exception ex in ae.InnerExceptions)
{
if (ex is DocumentClientException)
{
var documentClientException = ex as DocumentClientException;
var statusCode = (int)documentClientException.StatusCode;
if (statusCode == 429 || statusCode == 503)
{
//Sleep for retry amount
Thread.Sleep(documentClientException.RetryAfter);
//Decrement max retry attempts
maxRetryAttempts--;
}
else
{
throw;
}
}
}
}
}
if (maxRetryAttempts < 0)
{
//Max retry attempts reached
}
【问题讨论】:
-
在您的
catch块中,当展开AggregateException时,您会默默地丢弃所有非DocumentClientException异常。这是故意的吗?我本以为会冒出未知的异常。
标签: c# azure azure-cosmosdb