감사합니다 여기에 대한 대답.그 답변 난이 포럼에서 발견 좋은 포스트
: 이것은 단지 예이며
public static TResult Do<T,TResult>(Func<T,TResult> action, T param, TimeSpan retryInterval, int retryCount = 3)
{
for (int retry = 0; retry < retryCount; retry++)
{
try
{
return action(param);
}
catch (RetryOperationException)
{
Log.SaveFormat("Retry:{0} for action:{1}", "RetryProcessLog",retry, action.Method.Name);
Thread.Sleep(retryInterval);
}
catch (Exception ex)
{
Log.SaveFormat("Exception when retry:{0} error:{1}","RetryProcessLog",action.Method.Name,ex.Message);
return default(TResult);
}
}
return default(TResult);
}
public static T ExecuteGet<T>(string key)
{
var defaultReturnValue = default(T);
cacheHit("ExecuteGet", key);
var result = CacheClient.ExecuteGet<T>(CachePrefix + key);
if (result.Success)
{
return result.Value;
}
else if (result.StatusCode ==
CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.Busy)
||
result.StatusCode ==
CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.TemporaryFailure)
||
result.StatusCode ==
CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.SocketPoolTimeout)
||
result.StatusCode ==
CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.UnableToLocateNode)
||
result.StatusCode ==
CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.NodeShutdown)
||
result.StatusCode ==
CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.OperationTimeout))
{
Log.SaveFormat("Error:{0}:{2} in ExecuteGet for key:{1}. Going to throw RetryOperationException",
"CacheManager", result.StatusCode, key,result.Message);
throw new RetryOperationException();
}
Log.SaveFormat("Error:{0}:{2} in ExecuteGet for key:{1}", "CacheManager", result.StatusCode, key,result.Message);
return defaultReturnValue;
}
: 여기 Retry process
나는 몇 가지 코드를 작성하고 그 방법 중 하나에 대한 예입니다 둘 이상의 매개 변수 또는 다른 메서드를 반환 값없이 가져 오는 메서드 오버로드를 추가 할 수 있습니다. 두 번째 방법은 다른 클래스에 있고 ExecuteGet을 사용합니다.
var result = RetryProcess.Do(CacheManager.ExecuteGet<long>, keyOfValue, TimeSpan.FromMilliseconds(10));
는 희망이 도움이 :
그리고 여기는 사용의 예입니다.
XXX 대신 ExecuteXXX를 사용하면 성능에 어떤 영향이 있습니까? 내가 읽었던 couchbase 문서에서 오류 코드를 처리하는 방법에 대한 정보 나 샘플이 없습니다. 예 : 언제 기다려야하고 다시 시도해야합니까? 몇 번이나해야합니까? – FelProNet
성능 효과를 위해, 거의 아무것도; 서버와 클라이언트에서 이미 사용할 수있는 정보를 가진 객체 만 반환하면됩니다. – jeffrymorris
감사합니다. Jeff. 공연 후에 질문 한 다른 질문에 대한 답변이 있습니까? – FelProNet