Merge pull request #6501 from elsa-workflows/bug/faulting-executing

Refactor activity execution state handling with IDisposable
This commit is contained in:
Sipke Schoorstra 2025-03-17 08:40:46 +01:00 committed by GitHub
commit 714d8b6f3d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 26 additions and 9 deletions

View file

@ -177,6 +177,11 @@ public partial class ActivityExecutionContext : IExecutionContext, IDisposable
}
}
public IDisposable EnterExecution()
{
return new WorkflowExecutionState(this);
}
/// <summary>
/// Sets the current status of the activity.
/// </summary>

View file

@ -48,10 +48,9 @@ public class DefaultActivityInvokerMiddleware(ActivityMiddlewareDelegate next, I
context.AddExecutionLogEntry("Precondition Failed", "Cannot execute at this time");
return;
}
// Mark workflow and activity as executing.
context.WorkflowExecutionContext.IsExecuting = true;
context.IsExecuting = true;
using var executionState = context.EnterExecution();
// Conditionally commit the workflow state.
if (ShouldCommit(context, ActivityLifetimeEvent.ActivityExecuting))
@ -87,10 +86,6 @@ public class DefaultActivityInvokerMiddleware(ActivityMiddlewareDelegate next, I
workflowExecutionContext.Bookmarks.AddRange(context.Bookmarks);
logger.LogDebug("Added {BookmarkCount} bookmarks to the workflow execution context", context.Bookmarks.Count);
}
// Mark activity as executed.
context.IsExecuting = false;
context.WorkflowExecutionContext.IsExecuting = false;
// Conditionally commit the workflow state.
if (ShouldCommit(context, ActivityLifetimeEvent.ActivityExecuted))
@ -151,8 +146,8 @@ public class DefaultActivityInvokerMiddleware(ActivityMiddlewareDelegate next, I
{
var workflowStrategyName = context.WorkflowExecutionContext.Workflow.Options.CommitStrategyName;
var workflowStrategy = string.IsNullOrWhiteSpace(workflowStrategyName) ? null : commitStrategyRegistry.FindWorkflowStrategy(workflowStrategyName);
if(workflowStrategy == null)
if (workflowStrategy == null)
return false;
var workflowLifetimeEvent = lifetimeEvent == ActivityLifetimeEvent.ActivityExecuting ? WorkflowLifetimeEvent.ActivityExecuting : WorkflowLifetimeEvent.ActivityExecuted;

View file

@ -0,0 +1,17 @@
namespace Elsa.Workflows;
internal class WorkflowExecutionState : IDisposable
{
private readonly ActivityExecutionContext _activityExecutionContext;
public WorkflowExecutionState(ActivityExecutionContext activityExecutionContext)
{
_activityExecutionContext = activityExecutionContext;
_activityExecutionContext.IsExecuting = activityExecutionContext.WorkflowExecutionContext.IsExecuting = true;
}
public void Dispose()
{
_activityExecutionContext.IsExecuting = _activityExecutionContext.WorkflowExecutionContext.IsExecuting = false;
}
}