2012-04-10 68 views
1

我试图使用Microsoft.WindowsAzure.StorageClient.RetryPolicy;无需连接到Azure服务P&P RetryPolicy,什么是瞬态异常

var _retry = RetryPolicyFactory.GetRetryPolicy<StorageTransientErrorDetectionStrategy>("Incremental Retry Strategy"); 
    var result = _retry.ExecuteAction(()=> InnerRequest(data)); 

问题是 - 应该怎么做InnerRequest方法做RetryPolicy开始工作? 它应该抛出某种指定的异常?通过在Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling组件(如StorageTransientErrorDetectionStrategy程式码中)提供的错误检测策略自动检测

回答

5

瞬态错误,而这将触发重试的政策。

实际上,这是基于您可以在中找到的Microsoft.Practices.TransientFaultHandling.Core程序集。在Azure的特定组件的每个错误检测策略实现了以下接口:

/// <summary> 
/// Defines an interface which must be implemented by custom components responsible for detecting specific transient conditions. 
/// </summary> 
public interface ITransientErrorDetectionStrategy 
{ 
    /// <summary> 
    /// Determines whether the specified exception represents a transient failure that can be compensated by a retry. 
    /// </summary> 
    /// <param name="ex">The exception object to be verified.</param> 
    /// <returns>True if the specified exception is considered as transient, otherwise false.</returns> 
    bool IsTransient(Exception ex); 
} 

这里是你使用StorageTransientErrorDetectionStrategy的例子:

WebException webException = ex as WebException; 
if (webException != null && (webException.Status == WebExceptionStatus.ProtocolError || webException.Status == WebExceptionStatus.ConnectionClosed)) 
{ 
    return true; 
} 
DataServiceRequestException dataServiceException = ex as DataServiceRequestException; 
if (dataServiceException != null && StorageTransientErrorDetectionStrategy.IsErrorStringMatch(StorageTransientErrorDetectionStrategy.GetErrorCode(dataServiceException), new string[] 
{ 
    "InternalError", 
    "ServerBusy", 
    "OperationTimedOut", 
    "TableServerOutOfMemory" 
})) 
{ 
    return true; 
} 
StorageServerException serverException = ex as StorageServerException; 
if (serverException != null) 
{ 
    if (StorageTransientErrorDetectionStrategy.IsErrorCodeMatch(serverException, new StorageErrorCode[] 
    { 
     1, 
     2 
    })) 
    { 
     return true; 
    } 
    if (StorageTransientErrorDetectionStrategy.IsErrorStringMatch(serverException, new string[] 
    { 
     "InternalError", 
     "ServerBusy", 
     "OperationTimedOut" 
    })) 
    { 
     return true; 
    } 
} 
StorageClientException storageException = ex as StorageClientException; 
return (storageException != null && StorageTransientErrorDetectionStrategy.IsErrorStringMatch(storageException, new string[] 
{ 
    "InternalError", 
    "ServerBusy", 
    "TableServerOutOfMemory" 
})) || ex is TimeoutException; 
相关问题