From 599c6a5cd69fd0fb565ee2071c88359e17ae668e Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 24 Dec 2020 21:38:45 +0100 Subject: [PATCH] Fix workflow execution This fixes an issue where blocking activities would not actually block workflow execution from continuing, due to the workflow runner continuing to schedule the posted activities. --- .../Services/Models/WorkflowExecutionContext.cs | 10 +++------- src/core/Elsa.Core/Services/WorkflowRunner.cs | 12 +++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs b/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs index e7bd00c61..14c822cd2 100644 --- a/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs +++ b/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs @@ -94,14 +94,10 @@ namespace Elsa.Services.Models public IActivityBlueprint? GetActivityBlueprintById(string id) => WorkflowBlueprint.Activities.FirstOrDefault(x => x.Id == id); public IActivityBlueprint? GetActivityBlueprintByName(string name) => WorkflowBlueprint.Activities.FirstOrDefault(x => x.Name == name); - public void SchedulePostActivities() + public void SchedulePostActivity() { - var activities = WorkflowInstance.PostScheduledActivities.Reverse(); - - foreach (var activity in activities) - ScheduleActivity(activity); - - WorkflowInstance.PostScheduledActivities.Clear(); + var activity = WorkflowInstance.PostScheduledActivities.Pop(); + ScheduleActivity(activity); } public object? GetOutputFrom(string activityName) diff --git a/src/core/Elsa.Core/Services/WorkflowRunner.cs b/src/core/Elsa.Core/Services/WorkflowRunner.cs index 22cda1f96..95ba74600 100644 --- a/src/core/Elsa.Core/Services/WorkflowRunner.cs +++ b/src/core/Elsa.Core/Services/WorkflowRunner.cs @@ -286,15 +286,13 @@ namespace Elsa.Services activityOperation = Execute; workflowExecutionContext.CompletePass(); + // Exit execution loop if workflow has any other status than Running (i.e. Suspended). Otherwise continue the loop. + if (workflowExecutionContext.Status != WorkflowStatus.Running) + break; + // If there are no more scheduled activities, schedule any post-scheduled activities. if (!workflowExecutionContext.HasScheduledActivities && workflowExecutionContext.HasPostScheduledActivities) - { - workflowExecutionContext.SchedulePostActivities(); - - // Exit execution loop if workflow has any other status than Running (i.e. Suspended). Otherwise continue the loop. - if (workflowExecutionContext.Status != WorkflowStatus.Running) - break; - } + workflowExecutionContext.SchedulePostActivity(); } if (workflowExecutionContext.HasBlockingActivities)