我正在使用microsoft的标准示例将新实体插入表中。 有没有办法跟踪是否执行了重试?
代码:
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("people");
CustomerEntity customer1 = new CustomerEntity("Harp", "Walter");
TableOperation insertOperation = TableOperation.Insert(customer1);
table.Execute(insertOperation);
使用TransientFaultHandlingFramework很容易做到:
var retryPol = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(retryStrategy);
retryPol.Retrying += (obj, eventArgs) =>
{
var msg = String.Format("Retrying, CurrentRetryCount = {0} , Delay = {1}, Exception = {2}", eventArgs.CurrentRetryCount, eventArgs.Delay, eventArgs.LastException.Message);
System.Diagnostics.Debug.WriteLine(msg);
};
答案 0 :(得分:5)
您可以按照Enterprise Library Transient Fault Handling Application Block:
中的说明使用Rob's answervar retryPol = new RetryPolicy<StorageTransientErrorDetectionStrategy>(retryStrategy);
retryPol.Retrying += (obj, eventArgs) =>
{
var msg = String.Format("Retrying, CurrentRetryCount = {0} , Delay = {1}, Exception = {2}", eventArgs.CurrentRetryCount, eventArgs.Delay, eventArgs.LastException.Message);
System.Diagnostics.Debug.WriteLine(msg);
};
var options = new TableRequestOptions { RetryPolicy = new RetryPolicies.NoRetry() };
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("people");
CustomerEntity customer1 = new CustomerEntity("Harp", "Walter");
TableOperation insertOperation = TableOperation.Insert(customer1);
retryPol.ExecuteAction<TableResult>(() => { return table.Execute(insertOperation, options); });
如果您更喜欢仅使用Windows Azure存储客户端库,则可以创建引发事件的自定义重试策略,如下所示:
public class EventExponentialRetry : IRetryPolicy
{
private static readonly TimeSpan DefaultClientBackoff = TimeSpan.FromSeconds(4.0);
private const int DefaultClientRetryCount = 3;
private TimeSpan deltaBackoff;
private int maximumAttempts;
private ExponentialRetry retry;
public event EventHandler<RetryEventArgs> RaiseRetryEvent;
public EventExponentialRetry()
{
Initialize(DefaultClientBackoff, DefaultClientRetryCount);
}
public EventExponentialRetry(TimeSpan deltaBackoff, int maxAttempts)
{
Initialize(deltaBackoff, maxAttempts);
}
private void Initialize(TimeSpan deltaBackoff, int maxAttempts)
{
this.deltaBackoff = deltaBackoff;
this.maximumAttempts = maxAttempts;
retry = new ExponentialRetry(this.deltaBackoff, this.maximumAttempts);
}
public IRetryPolicy CreateInstance()
{
EventExponentialRetry newInstance = new EventExponentialRetry(this.deltaBackoff, this.maximumAttempts);
newInstance.RaiseRetryEvent = this.RaiseRetryEvent;
return newInstance;
}
public bool ShouldRetry(int currentRetryCount, int statusCode, Exception lastException, out TimeSpan retryInterval, OperationContext operationContext)
{
bool shouldRetry = retry.ShouldRetry(currentRetryCount, statusCode, lastException, out retryInterval, operationContext);
if (shouldRetry)
{
OnRaiseRetryEvent(new RetryEventArgs(currentRetryCount, statusCode, lastException, retryInterval, operationContext));
}
return shouldRetry;
}
protected virtual void OnRaiseRetryEvent(RetryEventArgs e)
{
// Make a temporary copy of the event to avoid possibility of
// a race condition if the last subscriber unsubscribes
// immediately after the null check and before the event is raised.
EventHandler<RetryEventArgs> handler = RaiseRetryEvent;
// Event will be null if there are no subscribers.
if (handler != null)
{
// Use the () operator to raise the event.
handler(this, e);
}
}
}
有关完整示例,请参阅CustomAzureStorageRetryPolicySample GitHub project。
答案 1 :(得分:1)
您可以将同一企业瞬态故障处理框架与您的表存储(及其相关的重试通知)结合使用。
要执行此操作,请禁用默认的表存储瞬态故障处理,并改为使用企业存储故障处理。
var retryPol = new RetryPolicy<StorageTransientErrorDetectionStrategy>(retryStrategy);
retryPol.Retrying += (obj, eventArgs) =>
{
var msg = String.Format("Retrying, CurrentRetryCount = {0} , Delay = {1}, Exception = {2}", eventArgs.CurrentRetryCount, eventArgs.Delay, eventArgs.LastException.Message);
System.Diagnostics.Debug.WriteLine(msg);
};
var options = new TableRequestOptions { RetryPolicy = new RetryPolicies.NoRetry() };
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("people");
CustomerEntity customer1 = new CustomerEntity("Harp", "Walter");
TableOperation insertOperation = TableOperation.Insert(customer1);
retryPol.ExecuteAction<TableResult>(() => { return table.Execute(insertOperation, options); });