Update Break behavior to also handle "CompleteComposite" signal

This commit is contained in:
Sipke Schoorstra 2023-08-04 22:15:07 +02:00
parent 4faf40b3ae
commit e2cea7310f

View file

@ -15,6 +15,19 @@ public class BreakBehavior : Behavior
public BreakBehavior(IActivity owner) : base(owner)
{
OnSignalReceived<BreakSignal>(OnBreakAsync);
OnSignalReceived<CompleteCompositeSignal>(OnCompleteCompositeAsync);
}
private async ValueTask OnCompleteCompositeAsync(CompleteCompositeSignal signal, SignalContext context)
{
// Cancel each descendant to clear bookmarks and cancel jobs etc.
await CancelDescendantsAsync(context);
// Remove child activity execution contexts.
await context.ReceiverActivityExecutionContext.RemoveChildrenAsync();
// Mark this activity as completed.
await context.ReceiverActivityExecutionContext.CompleteActivityAsync();
}
private async ValueTask OnBreakAsync(BreakSignal signal, SignalContext context)
@ -23,11 +36,7 @@ public class BreakBehavior : Behavior
context.StopPropagation();
// Cancel each descendant to clear bookmarks and cancel jobs etc.
var descendants = context.ReceiverActivityExecutionContext.ActivityNode.Descendants().Select(x => x.Activity).ToList();
var workflowExecutionContext = context.SenderActivityExecutionContext.WorkflowExecutionContext;
foreach (var descendant in descendants)
await workflowExecutionContext.CancelActivityAsync(descendant);
await CancelDescendantsAsync(context);
// Remove child activity execution contexts.
await context.ReceiverActivityExecutionContext.RemoveChildrenAsync();
@ -35,4 +44,14 @@ public class BreakBehavior : Behavior
// Mark this activity as completed.
await context.ReceiverActivityExecutionContext.CompleteActivityAsync();
}
private async Task CancelDescendantsAsync(SignalContext context)
{
var senderActivity = context.SenderActivityExecutionContext.Activity;
var descendants = context.ReceiverActivityExecutionContext.ActivityNode.Descendants().Select(x => x.Activity).Where(x => x.Id != senderActivity.Id).ToList();
var workflowExecutionContext = context.ReceiverActivityExecutionContext.WorkflowExecutionContext;
foreach (var descendant in descendants)
await workflowExecutionContext.CancelActivityAsync(descendant);
}
}