Ejemplo n.º 1
0
 internal P_ComponentActivationAttempt(int retryIndex, IActivatableXAppScopeInstance component, XFullCorrelationId correlationId, CancellationToken ct)
 {
     retryIndex
     .Arg(nameof(retryIndex))
     .EnsureNotLessThan(operand: -1);
     component.EnsureNotNull(nameof(component));
     correlationId.EnsureNotNull(nameof(correlationId));
     //
     _retryIndex      = retryIndex;
     _correlationId   = correlationId;
     _component       = component;
     _activateControl =
         new RunControl <P_ComponentActivationAttempt>(
             options: RunControlOptions.SingleStart,
             component: this,
             start: P_DoActivateAsync,
             stop: P_DoDeactivateAsync,
             stopToken: ct);
 }
Ejemplo n.º 2
0
        // TODO: Put strings into the resources.
        //
        void P_HandleComponentActivationAttemptResult(
            RetrySettings retryOptions,
            IActivatableXAppScopeInstance component,
            int retryAttemptIndex,
            Task activationTask,
            XFullCorrelationId correlationId,
            CancellationToken ct)
        {
            //
            retryOptions = retryOptions.EnsureNotNull(nameof(retryOptions)).AsReadOnly().EnsureValid();
            component.EnsureNotNull(nameof(component));
            retryAttemptIndex.Arg(nameof(retryAttemptIndex)).EnsureNotLessThan(-1);
            activationTask.EnsureNotNull(nameof(activationTask));
            //
            var logMessagePrologue = $"Отложенная активация. ИД корреляции: {correlationId.FmtStr().G()}.";

            if (activationTask.IsFaulted || activationTask.IsCanceled)
            {
                if (activationTask.IsCanceled)
                {
#if !DO_NOT_USE_EON_LOGGING_API
                    this
                    .IssueWarning(
                        messagePrologue: logMessagePrologue,
                        message: $"Активация компонента была прервана или отменена.{Environment.NewLine}Повторная попытка не предусмотрена опциями активации компонента.{Environment.NewLine}\tКомпонент:{component.FmtStr().GNLI2()}",
                        severityLevel: SeverityLevel.Medium);
#endif
                }
                else
                {
                    string retryActivationLogMessage;
                    bool   doRetryActivation;
                    if (retryOptions.IsDisabled)
                    {
                        doRetryActivation         = false;
                        retryActivationLogMessage = $"Повторная попытка активации компонента запрещена настройками активации (см. '{nameof(RetrySettings)}.{nameof(RetrySettings.IsDisabled)}').";
                    }
                    else if (retryOptions.MaxCount == -1)
                    {
                        doRetryActivation         = true;
                        retryActivationLogMessage = $"Повторная попытка активации компонента будет выполнена {(retryOptions.Interval == TimeoutDuration.Zero ? "немедленно" : $"через '{retryOptions.Interval.ToString()}'")}.";
                    }
                    else if (retryOptions.MaxCount == 0)
                    {
                        doRetryActivation         = false;
                        retryActivationLogMessage = $"Повторная попытка не предусмотрена настройками активации компонента (см. '{nameof(RetrySettings)}.{nameof(RetrySettings.MaxCount)}').";
                    }
                    else if ((retryAttemptIndex + 1) < retryOptions.MaxCount)
                    {
                        doRetryActivation         = true;
                        retryActivationLogMessage = $"Повторная попытка активации компонента ({retryAttemptIndex + 2:d} из {retryOptions.MaxCount:d}) будет выполнена {(retryOptions.Interval == TimeoutDuration.Zero ? "немедленно" : $"через '{retryOptions.Interval.ToString()}'")}.";
                    }
                    else
                    {
                        doRetryActivation         = false;
                        retryActivationLogMessage = $"Повторной попытки активации компонента не будет, так как все попытки исчерпаны (кол-во попыток {retryOptions.MaxCount:d}).";
                    }
#if !DO_NOT_USE_EON_LOGGING_API
                    this
                    .IssueError(
                        messagePrologue: logMessagePrologue,
                        message: $"Ошибка активации компонента.{Environment.NewLine}{retryActivationLogMessage}{Environment.NewLine}\tКомпонент:{Environment.NewLine}{component.ToString().IndentLines2()}",
                        error: activationTask.Exception,
                        includeErrorInIssueFaultException: true,
                        severityLevel: activationTask.Exception.GetMostHighSeverityLevel(baseLevel: SeverityLevel.Medium));
#endif
                    //
                    if (doRetryActivation)
                    {
                        if (retryOptions.Interval == TimeoutDuration.Zero)
                        {
                            P_StartComponentActivationAttempt(retryOptions: retryOptions, rethrowException: false, retryAttemptIndex: retryAttemptIndex + 1, correlationId: correlationId, ct: ct);
                        }
                        else
                        {
                            TaskUtilities
                            .Delay(duration: retryOptions.Interval)
                            .ContinueWith(
                                continuationAction:
                                locDelayTask
                                =>
                                P_StartComponentActivationAttempt(
                                    retryOptions: retryOptions,
                                    rethrowException: false,
                                    retryAttemptIndex: retryAttemptIndex + 1,
                                    ct: ct,
                                    correlationId: correlationId),
                                continuationOptions: TaskContinuationOptions.PreferFairness | TaskContinuationOptions.OnlyOnRanToCompletion,
                                cancellationToken: ct,
                                scheduler: TaskScheduler.Default);
                        }
                    }
                }
            }
            else
            {
#if !DO_NOT_USE_EON_LOGGING_API
                this
                .IssueInformation(
                    messagePrologue: logMessagePrologue,
                    message: $"Активация компонента успешно выполнена.{Environment.NewLine}\tКомпонент:{component.FmtStr().GNLI2()}",
                    severityLevel: SeverityLevel.Medium);
#endif
            }
        }