Esempio n. 1
0
        /// <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);
                }
            }
        }
Esempio n. 2
0
        /// <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);
                }
            }
        }