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); }
// 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 } }