elsa-core/src/modules/Elsa.Modules.Scheduling/Services/WorkflowBookmarkScheduler.cs

57 lines
2.1 KiB
C#
Raw Normal View History

using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Elsa.Models;
2022-02-01 19:45:11 +00:00
using Elsa.Modules.Scheduling.Activities;
using Elsa.Modules.Scheduling.Contracts;
using Elsa.Modules.Scheduling.Jobs;
using Elsa.Persistence.Entities;
2022-03-07 21:56:16 +00:00
using Elsa.Jobs.Contracts;
using Elsa.Jobs.Schedules;
using Elsa.Persistence.Extensions;
2022-02-01 19:45:11 +00:00
namespace Elsa.Modules.Scheduling.Services;
public class WorkflowBookmarkScheduler : IWorkflowBookmarkScheduler
{
private const string RootGroupKey = "WorkflowInstance";
private readonly IJobScheduler _jobScheduler;
public WorkflowBookmarkScheduler(IJobScheduler jobScheduler)
{
_jobScheduler = jobScheduler;
}
public async Task ScheduleBookmarksAsync(string workflowInstanceId, IEnumerable<WorkflowBookmark> bookmarks, CancellationToken cancellationToken = default)
{
var bookmarkList = bookmarks.ToList();
// Select all Delay bookmarks.
var delayBookmarks = bookmarkList.Filter<Delay>().ToList();
var groupKeys = new[] { RootGroupKey, workflowInstanceId };
// Schedule a trigger for each bookmark.
foreach (var bookmark in delayBookmarks)
{
2022-03-07 11:01:27 +00:00
var payload = JsonSerializer.Deserialize<DelayPayload>(bookmark.Data!)!;
var resumeAt = payload.ResumeAt;
var job = new ResumeWorkflowJob(workflowInstanceId, bookmark.ToBookmark());
var schedule = new SpecificInstantSchedule(resumeAt);
await _jobScheduler.ScheduleAsync(job, schedule, groupKeys, cancellationToken);
}
}
public async Task UnscheduleBookmarksAsync(string workflowInstanceId, IEnumerable<WorkflowBookmark> bookmarks, CancellationToken cancellationToken = default)
{
var bookmarkList = bookmarks.ToList();
var delayBookmarks = bookmarkList.Filter<Delay>().ToList();
foreach (var bookmark in delayBookmarks)
{
var job = new ResumeWorkflowJob(workflowInstanceId, bookmark.ToBookmark());
await _jobScheduler.UnscheduleAsync(job, cancellationToken);
}
}
}