< Summary

Information
Class: Elsa.Workflows.Runtime.Tasks.RestartInterruptedWorkflowsTask
Assembly: Elsa.Workflows.Runtime
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Tasks/RestartInterruptedWorkflowsTask.cs
Line coverage
100%
Covered lines: 36
Uncovered lines: 0
Coverable lines: 36
Total lines: 70
Line coverage: 100%
Branch coverage
92%
Covered branches: 13
Total branches: 14
Branch coverage: 92.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ExecuteAsync()92.85%1414100%
CreateWorkflowInstanceFilter()100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Tasks/RestartInterruptedWorkflowsTask.cs

#LineLine coverage
 1using Elsa.Common;
 2using Elsa.Common.Multitenancy;
 3using Elsa.Common.RecurringTasks;
 4using Elsa.Workflows.Management;
 5using Elsa.Workflows.Management.Filters;
 6using Elsa.Workflows.Runtime.Options;
 7using JetBrains.Annotations;
 8using Microsoft.Extensions.Logging;
 9using Microsoft.Extensions.Options;
 10
 11namespace Elsa.Workflows.Runtime.Tasks;
 12
 13[SingleNodeTask]
 14[UsedImplicitly]
 10215public class RestartInterruptedWorkflowsTask(
 10216    IWorkflowRestarter workflowRestarter,
 10217    IWorkflowInstanceStore workflowInstanceStore,
 10218    ILogger<RestartInterruptedWorkflowsTask> logger,
 10219    IOptions<RuntimeOptions> options,
 10220    ISystemClock systemClock,
 10221    ITenantService? tenantService = null,
 10222    ITenantAccessor? tenantAccessor = null) : RecurringTask
 23{
 24    /// <inheritdoc />
 25    public override async Task ExecuteAsync(CancellationToken cancellationToken)
 26    {
 7927        var workflowInstanceFilter = CreateWorkflowInstanceFilter();
 7928        var batchSize = options.Value.RestartInterruptedWorkflowsBatchSize;
 7929        var workflowInstances = workflowInstanceStore.EnumerateSummariesAsync(workflowInstanceFilter, batchSize, cancell
 30
 7931        logger.LogInformation("Restarting interrupted workflows.");
 18032        await foreach (var workflowInstance in workflowInstances)
 33        {
 34            try
 35            {
 1136                var tenantId = workflowInstance.TenantId ?? string.Empty;
 37
 1138                if (tenantService != null && tenantAccessor != null && !string.IsNullOrWhiteSpace(tenantId) && tenantId 
 39                {
 440                    var tenant = await tenantService.FindAsync(tenantId, cancellationToken) ?? new Tenant { Id = tenantI
 41
 342                    using (tenantAccessor.PushContext(tenant))
 343                        await workflowRestarter.RestartWorkflowAsync(workflowInstance.Id, cancellationToken: cancellatio
 44
 345                    continue;
 46                }
 47
 748                await workflowRestarter.RestartWorkflowAsync(workflowInstance.Id, cancellationToken: cancellationToken);
 749            }
 150            catch (Exception ex)
 51            {
 152                logger.LogError(ex, "Failed to restart interrupted workflow {WorkflowInstanceId}", workflowInstance.Id);
 153            }
 854        }
 7955        logger.LogInformation("Finished restarting interrupted workflows.");
 7956    }
 57
 58    private WorkflowInstanceFilter CreateWorkflowInstanceFilter()
 59    {
 7960        var livenessThreshold = options.Value.InactivityThreshold;
 7961        var now = systemClock.UtcNow;
 7962        var cutoffTimestamp = now - livenessThreshold;
 7963        return new()
 7964        {
 7965            IsExecuting = true,
 7966            BeforeLastUpdated = cutoffTimestamp,
 7967            WorkflowStatus = WorkflowStatus.Running,
 7968        };
 69    }
 70}