using Elsa.Common; using Elsa.Common.Multitenancy; using Elsa.Workflows.Runtime; using Elsa.Workflows.Runtime.Filters; using Elsa.Workflows.Runtime.Tasks; using Microsoft.Extensions.DependencyInjection; namespace Elsa.Scheduling.StartupTasks; /// /// Enqueues schedule creation when using the default scheduler, which doesn't have its own persistence layer like Quartz or Hangfire. /// [TaskDependency(typeof(PopulateRegistriesStartupTask))] public class CreateSchedulesStartupTask(IServiceProvider serviceProvider) : IStartupTask { public async Task ExecuteAsync(CancellationToken cancellationToken) { var workQueue = serviceProvider.GetService(); if (workQueue != null) await workQueue.EnqueueAsync(CreateSchedulesAsync, cancellationToken); else await CreateSchedulesAsync(serviceProvider, cancellationToken); } private static async Task CreateSchedulesAsync(IServiceProvider serviceProvider, CancellationToken cancellationToken) { var triggerStore = serviceProvider.GetRequiredService(); var bookmarkStore = serviceProvider.GetRequiredService(); var triggerScheduler = serviceProvider.GetRequiredService(); var bookmarkScheduler = serviceProvider.GetRequiredService(); var stimulusNames = new[] { SchedulingStimulusNames.Cron, SchedulingStimulusNames.Timer, SchedulingStimulusNames.StartAt, SchedulingStimulusNames.Delay, }; var triggerFilter = new TriggerFilter { Names = stimulusNames }; var bookmarkFilter = new BookmarkFilter { Names = stimulusNames }; var triggers = (await triggerStore.FindManyAsync(triggerFilter, cancellationToken)).ToList(); var bookmarks = (await bookmarkStore.FindManyAsync(bookmarkFilter, cancellationToken)).ToList(); await triggerScheduler.ScheduleAsync(triggers, cancellationToken); await bookmarkScheduler.ScheduleAsync(bookmarks, cancellationToken); } }