/// <summary> /// 重试 For <see cref="IServiceTransaction"/> /// </summary> /// <param name="service">事物 Service</param> /// <param name="tag">标记</param> /// <param name="doAction">处理动作</param> /// <param name="errorAction">失败动作</param> /// <param name="transContext">上下文事物对象, 设置后不提交事物</param> /// <param name="retryCount">重试次数</param> /// <param name="retrySleep">重试间隔, 单位:毫秒</param> public static void Retry(this IServiceTransaction service, string tag, Action <IDbTransaction> doAction, Action <Exception> errorAction = null, IDbTransaction transContext = null, int retryCount = ErrorRetryCount, int retrySleep = ErrorRetrySleep) { ThrowHelper.ThrowIfNull(service, "service"); ThrowHelper.ThrowIfNull(tag, "tag"); ThrowHelper.ThrowIfNull(doAction, "doAction"); if (retryCount <= 0) { retryCount = ErrorRetryCount; } if (retrySleep < 0) { retrySleep = ErrorRetrySleep; } var saveTryCount = 0; while (true) { var trans = transContext ?? service.BeginTransaction(); try { doAction(trans); if (transContext == null) { service.CommitTransaction(trans); } return; } catch (Exception ex) { Logger.ErrorFormat("Retry-{0}-error, tryCount:{1}, ex:{2}", tag, saveTryCount, ex); if (transContext == null) { service.RollbackTransaction(trans); } errorAction?.Invoke(ex); saveTryCount++; if (saveTryCount >= retryCount) { throw ex; } Thread.Sleep(retrySleep * saveTryCount); } } }
/// <summary> /// 重试 Async For <see cref="IServiceTransaction"/> /// </summary> /// <param name="service">事物 Service</param> /// <param name="tag">标记</param> /// <param name="doAction">处理动作</param> /// <param name="errorAction">失败动作</param> /// <param name="transContext">上下文事物对象, 设置后不提交事物</param> /// <param name="retryCount">重试次数</param> /// <param name="retrySleep">重试间隔, 单位:毫秒</param> /// <param name="ignoreEx">忽略异常, 需 <paramref name="errorAction"/> 捕获异常</param> public static async Task RetryAsync(this IServiceTransaction service, string tag, Func <IDbTransaction, Task> doAction, Func <Exception, Task> errorAction = null, IDbTransaction transContext = null, int retryCount = ErrorRetryCount, int retrySleep = ErrorRetrySleep, bool ignoreEx = false) { ThrowHelper.ThrowIfNull(service, "service"); ThrowHelper.ThrowIfNull(tag, "tag"); ThrowHelper.ThrowIfNull(doAction, "doAction"); if (retryCount <= 0) { retryCount = ErrorRetryCount; } if (retrySleep < 0) { retrySleep = ErrorRetrySleep; } var saveTryCount = 0; while (true) { var trans = transContext ?? service.BeginTransaction(); try { await doAction(trans); if (transContext == null) { service.CommitTransaction(trans); } return; } catch (Exception ex) { Logger.ErrorFormat("RetryAsync-{0}-error, tryCount:{1}, ex:{2}", tag, saveTryCount, ex); if (transContext == null) { service.RollbackTransaction(trans); } errorAction?.Invoke(ex); saveTryCount++; if (saveTryCount >= retryCount) { if (ignoreEx) { return; } throw ex; } await Task.Delay(retrySleep *saveTryCount); } } }