diff --git a/src/activities/Elsa.Activities.ControlFlow/Activities/Join.cs b/src/activities/Elsa.Activities.ControlFlow/Activities/Join.cs
index 4b2ba4424..f72ec547a 100644
--- a/src/activities/Elsa.Activities.ControlFlow/Activities/Join.cs
+++ b/src/activities/Elsa.Activities.ControlFlow/Activities/Join.cs
@@ -122,6 +122,11 @@ namespace Elsa.Activities.ControlFlow.Activities
return $"@{sourceActivityId}_{sourceOutcomeName}";
}
+ public Task ExecutingActivityAsync(
+ WorkflowExecutionContext workflowExecutionContext,
+ IActivity activity,
+ CancellationToken cancellationToken) => Task.CompletedTask;
+
Task IWorkflowEventHandler.ActivityExecutedAsync(
WorkflowExecutionContext workflowContext,
IActivity activity,
diff --git a/src/core/Elsa.Abstractions/Services/IWorkflowEventHandler.cs b/src/core/Elsa.Abstractions/Services/IWorkflowEventHandler.cs
index c6cd9cf30..2b5c13302 100644
--- a/src/core/Elsa.Abstractions/Services/IWorkflowEventHandler.cs
+++ b/src/core/Elsa.Abstractions/Services/IWorkflowEventHandler.cs
@@ -9,6 +9,10 @@ namespace Elsa.Services
///
public interface IWorkflowEventHandler
{
+ ///
+ /// Invoked before an activity execution.
+ ///
+ Task ExecutingActivityAsync(WorkflowExecutionContext workflowExecutionContext, IActivity activity, CancellationToken cancellationToken);
///
/// Invoked when an activity has executed.
diff --git a/src/core/Elsa.Abstractions/Services/WorkflowEventHandlerBase.cs b/src/core/Elsa.Abstractions/Services/WorkflowEventHandlerBase.cs
index 2155c014f..730a9ff81 100644
--- a/src/core/Elsa.Abstractions/Services/WorkflowEventHandlerBase.cs
+++ b/src/core/Elsa.Abstractions/Services/WorkflowEventHandlerBase.cs
@@ -6,6 +6,15 @@ namespace Elsa.Services
{
public abstract class WorkflowEventHandlerBase : IWorkflowEventHandler
{
+ public Task ExecutingActivityAsync(
+ WorkflowExecutionContext workflowExecutionContext,
+ IActivity activity,
+ CancellationToken cancellationToken)
+ {
+ ExecutingActivity(workflowExecutionContext, activity);
+ return Task.CompletedTask;
+ }
+
public virtual Task ActivityExecutedAsync(
WorkflowExecutionContext workflowExecutionContext,
IActivity activity,
@@ -41,6 +50,12 @@ namespace Elsa.Services
return Task.CompletedTask;
}
+ protected virtual void ExecutingActivity(
+ WorkflowExecutionContext workflowExecutionContext,
+ IActivity activity)
+ {
+ }
+
protected virtual void ActivityExecuted(WorkflowExecutionContext workflowExecutionContext, IActivity activity)
{
}
diff --git a/src/core/Elsa.Core/Services/WorkflowInvoker.cs b/src/core/Elsa.Core/Services/WorkflowInvoker.cs
index 2180c42c4..b84ab2851 100644
--- a/src/core/Elsa.Core/Services/WorkflowInvoker.cs
+++ b/src/core/Elsa.Core/Services/WorkflowInvoker.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
@@ -345,6 +345,11 @@ namespace Elsa.Services
IActivity activity,
CancellationToken cancellationToken)
{
+ await workflowEventHandlers.InvokeAsync(
+ async x => await x.ExecutingActivityAsync(workflowContext, activity, cancellationToken),
+ logger
+ );
+
return await InvokeActivityAsync(
workflowContext,
activity,