Update Finish activity to only clear blocking activities of current container unless it's the root workflow, in which case ALL blocking activities are removed

This commit is contained in:
Sipke Schoorstra 2021-01-02 11:22:42 +01:00
parent c645e77e14
commit 717ced918f
3 changed files with 16 additions and 7 deletions

View file

@ -1,3 +1,4 @@
using System.Linq;
using Elsa.ActivityResults;
using Elsa.Attributes;
using Elsa.Services;
@ -8,7 +9,7 @@ namespace Elsa.Activities.ControlFlow
{
[Activity(
Category = "Workflows",
Description = "Removes any blocking activities and sets the status of the workflow to Completed."
Description = "Removes any blocking activities from the current container (workflow or composite activity)."
)]
public class Finish : Activity
{
@ -17,8 +18,13 @@ namespace Elsa.Activities.ControlFlow
protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context)
{
context.WorkflowExecutionContext.WorkflowInstance.BlockingActivities.Clear();
var parentBlueprint = context.ActivityBlueprint.Parent;
var blockingActivities = context.WorkflowExecutionContext.WorkflowInstance.BlockingActivities;
var blockingActivityIds = blockingActivities.Select(x => x.ActivityId).ToList();
var containedBlockingActivityIds = parentBlueprint == null ? blockingActivityIds : parentBlueprint.Activities.Where(x => blockingActivityIds.Contains(x.Id)).Select(x => x.Id).ToList();
blockingActivities.RemoveWhere(x => containedBlockingActivityIds.Contains(x.ActivityId));
return Done(OutputValue);
}
}

View file

@ -34,7 +34,9 @@ namespace Elsa.Samples.Timers.Activities
.WriteLine("Timer C went off")
.Then("Join1");
})
.Add<Join>(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join1").WriteLine("Container 1 Joined!");
.Add<Join>(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join1")
.WriteLine("Container 1 Joined!")
.Finish();
}
}
}

View file

@ -20,22 +20,23 @@ namespace Elsa.Samples.Timers.Activities
fork.When("C")
.Then<MyContainer1>()
.Then("Join2");
fork
.When("D")
.While(true, @while => @while
.Timer(Duration.FromSeconds(1))
.WriteLine("Timer D went off"))
.Then("Join2");
fork
.When("E")
.Timer(Duration.FromSeconds(15))
.WriteLine("Timer E went off. Exiting fork.")
.Then("Join2");
})
.Add<Join>(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join2").WriteLine("Container 2 Joined!")
;
.Add<Join>(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join2")
.WriteLine("Container 2 Joined!")
.Finish();
}
}
}