From f5f9c070cadd8a6daca9a0161bec2dc8243fd16f Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 20 Dec 2020 20:22:03 +0100 Subject: [PATCH] Optimize timer activities to always execute when target time stamp lies in past --- .../Elsa.Activities.Timers/Activities/Cron/Cron.cs | 3 +++ .../Elsa.Activities.Timers/Activities/StartAt/StartAt.cs | 7 ++++++- .../Elsa.Activities.Timers/Activities/Timer/Timer.cs | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/activities/Elsa.Activities.Timers/Activities/Cron/Cron.cs b/src/activities/Elsa.Activities.Timers/Activities/Cron/Cron.cs index 46b7aa48f..68f86dc90 100644 --- a/src/activities/Elsa.Activities.Timers/Activities/Cron/Cron.cs +++ b/src/activities/Elsa.Activities.Timers/Activities/Cron/Cron.cs @@ -49,6 +49,9 @@ namespace Elsa.Activities.Timers ExecuteAt = executeAt; + if (executeAt < _clock.GetCurrentInstant()) + return Done(); + await _workflowInstanceStore.SaveAsync(context.WorkflowExecutionContext.WorkflowInstance, cancellationToken); await _workflowScheduler.ScheduleWorkflowAsync(workflowBlueprint, workflowInstance.Id, Id, executeAt, cancellationToken); diff --git a/src/activities/Elsa.Activities.Timers/Activities/StartAt/StartAt.cs b/src/activities/Elsa.Activities.Timers/Activities/StartAt/StartAt.cs index 34a6c6b63..23b2eeda7 100644 --- a/src/activities/Elsa.Activities.Timers/Activities/StartAt/StartAt.cs +++ b/src/activities/Elsa.Activities.Timers/Activities/StartAt/StartAt.cs @@ -21,11 +21,13 @@ namespace Elsa.Activities.Timers { private readonly IWorkflowInstanceStore _workflowInstanceStore; private readonly IWorkflowScheduler _workflowScheduler; + private readonly IClock _clock; - public StartAt(IWorkflowInstanceStore workflowInstanceStore, IWorkflowScheduler workflowScheduler) + public StartAt(IWorkflowInstanceStore workflowInstanceStore, IWorkflowScheduler workflowScheduler, IClock clock) { _workflowInstanceStore = workflowInstanceStore; _workflowScheduler = workflowScheduler; + _clock = clock; } [ActivityProperty(Hint = "An instant in the future at which this activity should execute.")] @@ -49,6 +51,9 @@ namespace Elsa.Activities.Timers ExecuteAt = executeAt; + if (executeAt <= _clock.GetCurrentInstant()) + return Done(); + await _workflowInstanceStore.SaveAsync(context.WorkflowExecutionContext.WorkflowInstance, cancellationToken); await _workflowScheduler.ScheduleWorkflowAsync(workflowBlueprint, workflowInstance.Id, Id, executeAt, cancellationToken); diff --git a/src/activities/Elsa.Activities.Timers/Activities/Timer/Timer.cs b/src/activities/Elsa.Activities.Timers/Activities/Timer/Timer.cs index 6ba87a039..50cd69f82 100644 --- a/src/activities/Elsa.Activities.Timers/Activities/Timer/Timer.cs +++ b/src/activities/Elsa.Activities.Timers/Activities/Timer/Timer.cs @@ -32,7 +32,7 @@ namespace Elsa.Activities.Timers if (context.WorkflowExecutionContext.IsFirstPass) return Done(); - if (Timeout == Duration.Zero) + if (Timeout <= Duration.Zero) return Done(); ExecuteAt = _clock.GetCurrentInstant().Plus(Timeout);