< 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]
 8615public class RestartInterruptedWorkflowsTask(
 8616    IWorkflowRestarter workflowRestarter,
 8617    IWorkflowInstanceStore workflowInstanceStore,
 8618    ILogger<RestartInterruptedWorkflowsTask> logger,
 8619    IOptions<RuntimeOptions> options,
 8620    ISystemClock systemClock,
 8621    ITenantService? tenantService = null,
 8622    ITenantAccessor? tenantAccessor = null) : RecurringTask
 23{
 24    /// <inheritdoc />
 25    public override async Task ExecuteAsync(CancellationToken cancellationToken)
 26    {
 8127        var workflowInstanceFilter = CreateWorkflowInstanceFilter();
 8128        var batchSize = options.Value.RestartInterruptedWorkflowsBatchSize;
 8129        var workflowInstances = workflowInstanceStore.EnumerateSummariesAsync(workflowInstanceFilter, batchSize, cancell
 30
 8131        logger.LogInformation("Restarting interrupted workflows.");
 18432        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        }
 8155        logger.LogInformation("Finished restarting interrupted workflows.");
 8156    }
 57
 58    private WorkflowInstanceFilter CreateWorkflowInstanceFilter()
 59    {
 8160        var livenessThreshold = options.Value.InactivityThreshold;
 8161        var now = systemClock.UtcNow;
 8162        var cutoffTimestamp = now - livenessThreshold;
 8163        return new()
 8164        {
 8165            IsExecuting = true,
 8166            BeforeLastUpdated = cutoffTimestamp,
 8167            WorkflowStatus = WorkflowStatus.Running,
 8168        };
 69    }
 70}