< 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: 35
Uncovered lines: 0
Coverable lines: 35
Total lines: 69
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]
 8515public class RestartInterruptedWorkflowsTask(
 8516    IWorkflowRestarter workflowRestarter,
 8517    IWorkflowInstanceStore workflowInstanceStore,
 8518    ILogger<RestartInterruptedWorkflowsTask> logger,
 8519    IOptions<RuntimeOptions> options,
 8520    ISystemClock systemClock,
 8521    ITenantService? tenantService = null,
 8522    ITenantAccessor? tenantAccessor = null) : RecurringTask
 23{
 24    /// <inheritdoc />
 25    public override async Task ExecuteAsync(CancellationToken cancellationToken)
 26    {
 7827        var workflowInstanceFilter = CreateWorkflowInstanceFilter();
 7828        var batchSize = options.Value.RestartInterruptedWorkflowsBatchSize;
 7829        var workflowInstances = workflowInstanceStore.EnumerateSummariesAsync(workflowInstanceFilter, batchSize, cancell
 30
 7831        logger.LogInformation("Restarting interrupted workflows.");
 17232        await foreach (var workflowInstance in workflowInstances)
 33        {
 34            try
 35            {
 836                var tenantId = workflowInstance.TenantId ?? string.Empty;
 37
 838                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
 448                await workflowRestarter.RestartWorkflowAsync(workflowInstance.Id, cancellationToken: cancellationToken);
 449            }
 150            catch (Exception ex)
 51            {
 152                logger.LogError(ex, "Failed to restart interrupted workflow {WorkflowInstanceId}", workflowInstance.Id);
 153            }
 554        }
 7855        logger.LogInformation("Finished restarting interrupted workflows.");
 7856    }
 57
 58    private WorkflowInstanceFilter CreateWorkflowInstanceFilter()
 59    {
 7860        var livenessThreshold = options.Value.InactivityThreshold;
 7861        var now = systemClock.UtcNow;
 7862        var cutoffTimestamp = now - livenessThreshold;
 7863        return new()
 7864        {
 7865            IsExecuting = true,
 7866            BeforeLastUpdated = cutoffTimestamp
 7867        };
 68    }
 69}