From e00d41e0cf3f5b0284d2a085656d300d35fcabff Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 4 Dec 2020 15:38:19 +0100 Subject: [PATCH] Schedule activity until after Suspend action --- .../Activities/Timer/Timer.cs | 23 ++++---------- .../ActivityResults/ScheduleWorkflowResult.cs | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 src/activities/Elsa.Activities.Timers/ActivityResults/ScheduleWorkflowResult.cs diff --git a/src/activities/Elsa.Activities.Timers/Activities/Timer/Timer.cs b/src/activities/Elsa.Activities.Timers/Activities/Timer/Timer.cs index 99c616f65..84afe2c02 100644 --- a/src/activities/Elsa.Activities.Timers/Activities/Timer/Timer.cs +++ b/src/activities/Elsa.Activities.Timers/Activities/Timer/Timer.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using Elsa.Activities.Timers.Services; +using Elsa.Activities.Timers.ActivityResults; using Elsa.ActivityResults; using Elsa.Attributes; using Elsa.Services; @@ -12,14 +11,10 @@ namespace Elsa.Activities.Timers [Trigger(Category = "Timers", Description = "Triggers at a specified interval.")] public class Timer : Activity { - private readonly IWorkflowInstanceManager _workflowInstanceManager; - private readonly IWorkflowScheduler _workflowScheduler; private readonly IClock _clock; - public Timer(IWorkflowInstanceManager workflowInstanceManager, IWorkflowScheduler workflowScheduler, IClock clock) + public Timer(IClock clock) { - _workflowInstanceManager = workflowInstanceManager; - _workflowScheduler = workflowScheduler; _clock = clock; } @@ -32,22 +27,14 @@ namespace Elsa.Activities.Timers set => SetState(value); } - protected override async ValueTask OnExecuteAsync(ActivityExecutionContext context) + protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context) { if (context.WorkflowExecutionContext.IsFirstPass) return Done(); - var cancellationToken = context.CancellationToken; - var workflowBlueprint = context.WorkflowExecutionContext.WorkflowBlueprint; - var workflowInstance = context.WorkflowExecutionContext.WorkflowInstance; - var executeAt = _clock.GetCurrentInstant().Plus(Timeout); - - ExecuteAt = executeAt; + ExecuteAt = _clock.GetCurrentInstant().Plus(Timeout); - await _workflowInstanceManager.SaveAsync(context.WorkflowExecutionContext.WorkflowInstance, cancellationToken); - await _workflowScheduler.ScheduleWorkflowAsync(workflowBlueprint, workflowInstance.WorkflowInstanceId, Id, executeAt, cancellationToken); - - return Suspend(); + return Combine(Suspend(), new ScheduleWorkflowResult(ExecuteAt.Value)); } protected override IActivityExecutionResult OnResume() => Done(); diff --git a/src/activities/Elsa.Activities.Timers/ActivityResults/ScheduleWorkflowResult.cs b/src/activities/Elsa.Activities.Timers/ActivityResults/ScheduleWorkflowResult.cs new file mode 100644 index 000000000..8aaf78ab9 --- /dev/null +++ b/src/activities/Elsa.Activities.Timers/ActivityResults/ScheduleWorkflowResult.cs @@ -0,0 +1,30 @@ +using System.Threading; +using System.Threading.Tasks; +using Elsa.Activities.Timers.Services; +using Elsa.ActivityResults; +using Elsa.Models; +using Elsa.Services; +using Elsa.Services.Models; +using NodaTime; + +namespace Elsa.Activities.Timers.ActivityResults +{ + public class ScheduleWorkflowResult : ActivityExecutionResult + { + public ScheduleWorkflowResult(Instant executeAt) + { + ExecuteAt = executeAt; + } + + public Instant ExecuteAt { get; } + + public override async ValueTask ExecuteAsync(ActivityExecutionContext activityExecutionContext, CancellationToken cancellationToken) + { + var workflowInstance = activityExecutionContext.WorkflowExecutionContext.WorkflowInstance; + var workflowInstanceManager = activityExecutionContext.GetService(); + var scheduler = activityExecutionContext.GetService(); + await workflowInstanceManager.SaveAsync(workflowInstance, cancellationToken); + await scheduler.ScheduleWorkflowAsync(activityExecutionContext.WorkflowExecutionContext.WorkflowBlueprint, workflowInstance.WorkflowInstanceId, activityExecutionContext.ActivityInstance.Id, ExecuteAt, cancellationToken); + } + } +} \ No newline at end of file