Example #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);
                }
            }
        }
Example #2
0
 public ServiceAccount(
     IConfiguration configuration,
     IHttpClient httpClient,
     IOptionsSnapshot <JwtOptions> jwtOption,
     IServiceTransaction serviceTransaction)
 {
     this.configuration      = configuration;
     this.httpClient         = httpClient;
     this.serviceTransaction = serviceTransaction;
     this.jwtOption          = jwtOption.Value;
 }
 public AppServiceTransaction(IServiceTransaction serviceTransaction)
     : base(serviceTransaction)
 {
     _serviceTransaction = serviceTransaction;
 }
 /// <summary>
 /// Adds a service transaction as a step to the deployment 
 /// </summary>
 /// <param name="transaction"></param>
 public void AddDeploymentStep(IServiceTransaction transaction)
 {
     _transactionList.Add(transaction);
 }
 public TransactionsController(IServiceTransaction service, ILogger <TransactionsController> log)
 {
     _service = service ?? throw new ArgumentNullException(nameof(service));
     Log      = log ?? throw new ArgumentNullException(nameof(log));
 }
Example #6
0
 public TransactionController(IServiceTransaction services, IEventBus bus, IServiceAccount servicesAccount)
 {
     _services        = services;
     _bus             = bus;
     _servicesAccount = servicesAccount;
 }
Example #7
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);
                }
            }
        }
 /// <summary>
 /// Adds a service transaction as a step to the deployment
 /// </summary>
 /// <param name="transaction"></param>
 public void AddDeploymentStep(IServiceTransaction transaction)
 {
     _transactionList.Add(transaction);
 }