< Summary

Information
Class: Elsa.Scheduling.Services.DefaultTriggerScheduler
Assembly: Elsa.Scheduling
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Scheduling/Services/DefaultTriggerScheduler.cs
Line coverage
93%
Covered lines: 55
Uncovered lines: 4
Coverable lines: 59
Total lines: 107
Line coverage: 93.2%
Branch coverage
85%
Covered branches: 12
Total branches: 14
Branch coverage: 85.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ScheduleAsync()58.33%161270%
UnscheduleAsync()100%22100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Scheduling/Services/DefaultTriggerScheduler.cs

#LineLine coverage
 1using Elsa.Common;
 2using Elsa.Extensions;
 3using Elsa.Scheduling.Activities;
 4using Elsa.Scheduling.Bookmarks;
 5using Elsa.Workflows.Models;
 6using Elsa.Workflows.Runtime.Entities;
 7using Microsoft.Extensions.Logging;
 8
 9namespace Elsa.Scheduling.Services;
 10
 11/// <summary>
 12/// A default implementation of <see cref="ITriggerScheduler"/> that schedules triggers using <see cref="IWorkflowSchedu
 13/// </summary>
 67714public class DefaultTriggerScheduler(IWorkflowScheduler workflowScheduler, ISystemClock systemClock, ILogger<DefaultTrig
 15    : ITriggerScheduler
 16{
 17    /// <inheritdoc />
 18    public async Task ScheduleAsync(IEnumerable<StoredTrigger> triggers, CancellationToken cancellationToken = default)
 19    {
 150520        var triggerList = triggers.ToList();
 150521        var timerTriggers = triggerList.Filter<Activities.Timer>();
 150522        var startAtTriggers = triggerList.Filter<StartAt>();
 150523        var cronTriggers = triggerList.Filter<Cron>();
 150524        var now = systemClock.UtcNow;
 25
 26        // Schedule each Timer trigger.
 301427        foreach (var trigger in timerTriggers)
 28        {
 229            var (startAt, interval) = trigger.GetPayload<TimerTriggerPayload>();
 230            var input = new { StartAt = startAt, Interval = interval }.ToDictionary();
 231            var request = new ScheduleNewWorkflowInstanceRequest
 232            {
 233                WorkflowDefinitionHandle = WorkflowDefinitionHandle.ByDefinitionVersionId(trigger.WorkflowDefinitionVers
 234                TriggerActivityId = trigger.ActivityId,
 235                Input = input
 236            };
 237            await workflowScheduler.ScheduleRecurringAsync(trigger.Id, request, startAt, interval, cancellationToken);
 38        }
 39
 40        // Schedule each StartAt trigger.
 301241        foreach (var trigger in startAtTriggers)
 42        {
 143            var executeAt = trigger.GetPayload<StartAtPayload>().ExecuteAt;
 44
 145            if (executeAt < now)
 146                logger.LogInformation("StartAt trigger is in the past. TriggerId: {TriggerId}. ExecuteAt: {ExecuteAt}. S
 47
 148            var input = new { ExecuteAt = executeAt }.ToDictionary();
 149            var request = new ScheduleNewWorkflowInstanceRequest
 150            {
 151                WorkflowDefinitionHandle = WorkflowDefinitionHandle.ByDefinitionVersionId(trigger.WorkflowDefinitionVers
 152                TriggerActivityId = trigger.ActivityId,
 153                Input = input
 154            };
 55
 156            await workflowScheduler.ScheduleAtAsync(trigger.Id, request, executeAt, cancellationToken);
 57        }
 58
 59        // Schedule each Cron trigger.
 301460        foreach (var trigger in cronTriggers)
 61        {
 262            var payload = trigger.GetPayload<CronTriggerPayload>();
 263            if(payload is null)
 64            {
 065                logger.LogWarning("Cron expression payload is empty. TriggerId: {TriggerId}. Skipping scheduling of this
 066                continue;
 67            }
 68
 269            var cronExpression = payload.CronExpression;
 70
 271            if (string.IsNullOrWhiteSpace(cronExpression))
 72            {
 073                logger.LogWarning("Cron expression is empty. TriggerId: {TriggerId}. Skipping scheduling of this trigger
 074                continue;
 75            }
 76
 277            var input = new { CronExpression = cronExpression }.ToDictionary();
 278            var request = new ScheduleNewWorkflowInstanceRequest
 279            {
 280                WorkflowDefinitionHandle = WorkflowDefinitionHandle.ByDefinitionVersionId(trigger.WorkflowDefinitionVers
 281                TriggerActivityId = trigger.ActivityId,
 282                Input = input
 283            };
 84            try
 85            {
 286                await workflowScheduler.ScheduleCronAsync(trigger.Id, request, cronExpression, cancellationToken);
 187            }
 188            catch (FormatException ex)
 89            {
 190                logger.LogWarning(ex, "Cron expression format error. CronExpression: {CronExpression}", cronExpression);
 191            }
 292        }
 150593    }
 94
 95    /// <inheritdoc />
 96    public async Task UnscheduleAsync(IEnumerable<StoredTrigger> triggers, CancellationToken cancellationToken = default
 97    {
 150898        var triggerList = triggers.ToList();
 150899        var timerTriggers = triggerList.Filter<Activities.Timer>();
 1508100        var startAtTriggers = triggerList.Filter<StartAt>();
 1508101        var cronTriggers = triggerList.Filter<Cron>();
 1508102        var filteredTriggers = timerTriggers.Concat(startAtTriggers).Concat(cronTriggers);
 103
 3018104        foreach (var trigger in filteredTriggers)
 1105            await workflowScheduler.UnscheduleAsync(trigger.Id, cancellationToken);
 1508106    }
 107}