Add behavior that schedules child completion callbacks

This commit is contained in:
Sipke Schoorstra 2022-04-20 14:37:20 +02:00
parent 604b5c3e82
commit 4ab6edb865
3 changed files with 39 additions and 18 deletions

View file

@ -11,15 +11,15 @@ public class BreakBehavior : IBehavior
{
public async ValueTask HandleSignalAsync(object signal, SignalContext context)
{
if (signal is not BreakSignal breakSignal)
if (signal is not BreakSignal)
return;
await OnBreakAsync(breakSignal, context);
await OnBreakAsync(context);
}
public ValueTask ExecuteAsync(ActivityExecutionContext context) => ValueTask.CompletedTask;
private async ValueTask OnBreakAsync(BreakSignal signal, SignalContext context)
private async ValueTask OnBreakAsync(SignalContext context)
{
// Prevent bubbling.
context.StopPropagation();

View file

@ -0,0 +1,34 @@
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Signals;
namespace Elsa.Behaviors;
/// <summary>
/// Implements a "break" behavior that handles the <see cref="BreakSignal"/> signal.
/// </summary>
public class ScheduledChildCallbackBehavior : IBehavior
{
public async ValueTask HandleSignalAsync(object signal, SignalContext context)
{
if (signal is not ActivityCompleted)
return;
await OnChildActivityCompletedAsync(context);
}
public ValueTask ExecuteAsync(ActivityExecutionContext context) => ValueTask.CompletedTask;
private async ValueTask OnChildActivityCompletedAsync(SignalContext context)
{
var activityExecutionContext = context.ActivityExecutionContext;
var childActivityExecutionContext = context.SourceActivityExecutionContext;
var childActivity = childActivityExecutionContext.Activity;
var callbackEntry = activityExecutionContext.WorkflowExecutionContext.PopCompletionCallback(activityExecutionContext, childActivity);
if (callbackEntry == null)
return;
await callbackEntry(activityExecutionContext, childActivityExecutionContext);
}
}

View file

@ -1,7 +1,7 @@
using System.Linq.Expressions;
using Elsa.Behaviors;
using Elsa.Contracts;
using Elsa.Helpers;
using Elsa.Signals;
namespace Elsa.Models;
@ -12,7 +12,7 @@ public abstract class Activity : IActivity, ISignalHandler
protected Activity()
{
TypeName = TypeNameHelper.GenerateTypeName(GetType());
OnSignalReceived<ActivityCompleted>(OnChildActivityCompletedAsync);
Behaviors.Add<ScheduledChildCallbackBehavior>();
}
protected Activity(string activityType) : this()
@ -76,19 +76,6 @@ public abstract class Activity : IActivity, ISignalHandler
});
}
protected virtual async ValueTask OnChildActivityCompletedAsync(ActivityCompleted signal, SignalContext context)
{
var activityExecutionContext = context.ActivityExecutionContext;
var childActivityExecutionContext = context.SourceActivityExecutionContext;
var childActivity = childActivityExecutionContext.Activity;
var callbackEntry = activityExecutionContext.WorkflowExecutionContext.PopCompletionCallback(activityExecutionContext, childActivity);
if (callbackEntry == null)
return;
await callbackEntry(activityExecutionContext, childActivityExecutionContext);
}
async ValueTask IActivity.ExecuteAsync(ActivityExecutionContext context)
{
await ExecuteAsync(context);