diff --git a/src/apps/Directory.Build.props b/src/apps/Directory.Build.props index d5f14e067..50f33a49d 100644 --- a/src/apps/Directory.Build.props +++ b/src/apps/Directory.Build.props @@ -8,10 +8,6 @@ $(NoWarn);CS0162;CS1591 - - 3.5.0-preview.1040 - - diff --git a/src/modules/Elsa.Workflows.Core/Extensions/WorkflowExecutionContextExtensions.cs b/src/modules/Elsa.Workflows.Core/Extensions/WorkflowExecutionContextExtensions.cs index 57c01a6e6..f025ef74d 100644 --- a/src/modules/Elsa.Workflows.Core/Extensions/WorkflowExecutionContextExtensions.cs +++ b/src/modules/Elsa.Workflows.Core/Extensions/WorkflowExecutionContextExtensions.cs @@ -50,8 +50,8 @@ public static class WorkflowExecutionContextExtensions public static ActivityWorkItem ScheduleActivityExecutionContext(this WorkflowExecutionContext workflowExecutionContext, ActivityExecutionContext activityExecutionContext, IDictionary? input = null, IEnumerable? variables = null) { var workItem = new ActivityWorkItem( - activityExecutionContext.Activity, - input: input, + activityExecutionContext.Activity, + input: input, variables: variables, existingActivityExecutionContext: activityExecutionContext); workflowExecutionContext.Scheduler.Schedule(workItem); @@ -112,7 +112,7 @@ public static class WorkflowExecutionContextExtensions // Validate that the specified activity is part of the workflow. if (!workflowExecutionContext.NodeActivityLookup.ContainsKey(activityNode.Activity)) throw new InvalidOperationException("The specified activity is not part of the workflow."); - + var scheduler = workflowExecutionContext.Scheduler; if (options?.PreventDuplicateScheduling == true) @@ -145,4 +145,21 @@ public static class WorkflowExecutionContextExtensions var outputRegister = workflowExecutionContext.GetActivityOutputRegister(); return outputRegister.FindOutputByActivityId(activityId, outputName); } + + public static IEnumerable FindActivityExecutionContexts(this WorkflowExecutionContext workflowExecutionContext, ActivityHandle activityHandle) + { + if (activityHandle.ActivityInstanceId != null) + return workflowExecutionContext.ActivityExecutionContexts.Where(x => x.Id == activityHandle.ActivityInstanceId); + if (activityHandle.ActivityNodeId != null) + return workflowExecutionContext.ActivityExecutionContexts.Where(x => x.NodeId == activityHandle.ActivityNodeId); + if (activityHandle.ActivityId != null) + return workflowExecutionContext.ActivityExecutionContexts.Where(x => x.Activity.Id == activityHandle.ActivityId); + if (activityHandle.ActivityHash != null) + { + var activity = workflowExecutionContext.FindActivityByHash(activityHandle.ActivityHash); + return activity != null ? workflowExecutionContext.ActivityExecutionContexts.Where(x => x.Activity.NodeId == activity.NodeId) : []; + } + + return []; + } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Middleware/Activities/ExceptionHandlingMiddleware.cs b/src/modules/Elsa.Workflows.Core/Middleware/Activities/ExceptionHandlingMiddleware.cs index 60f4e3fec..b7028e2b8 100644 --- a/src/modules/Elsa.Workflows.Core/Middleware/Activities/ExceptionHandlingMiddleware.cs +++ b/src/modules/Elsa.Workflows.Core/Middleware/Activities/ExceptionHandlingMiddleware.cs @@ -1,8 +1,6 @@ using Elsa.Common; using Elsa.Extensions; -using Elsa.Workflows.Models; using Elsa.Workflows.Pipelines.ActivityExecution; -using Elsa.Workflows.State; using Microsoft.Extensions.Logging; namespace Elsa.Workflows.Middleware.Activities; @@ -34,34 +32,14 @@ public class ExceptionHandlingMiddleware(ActivityMiddlewareDelegate next, IIncid catch (Exception e) { logger.LogWarning(e, "An exception was caught from a downstream middleware component"); - LogExceptionAndTransition(context, e); - FaultAncestors(context); + context.Fault(e); await HandleIncidentAsync(context); } } - private void LogExceptionAndTransition(ActivityExecutionContext context, Exception e) - { - context.Exception = e; - context.TransitionTo(ActivityStatus.Faulted); - var activity = context.Activity; - var exceptionState = ExceptionState.FromException(e); - var now = systemClock.UtcNow; - var incident = new ActivityIncident(activity.Id, activity.NodeId ,activity.Type, e.Message, exceptionState, now); - context.WorkflowExecutionContext.Incidents.Add(incident); - } - private async Task HandleIncidentAsync(ActivityExecutionContext context) { var strategy = await incidentStrategyResolver.ResolveStrategyAsync(context); strategy.HandleIncident(context); } - - private static void FaultAncestors(ActivityExecutionContext context) - { - var ancestors = context.GetAncestors(); - - foreach (var ancestor in ancestors) - ancestor.TransitionTo(ActivityStatus.Faulted); - } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Models/ActivityHandle.cs b/src/modules/Elsa.Workflows.Core/Models/ActivityHandle.cs index ba0cb92c8..7ffefa1d2 100644 --- a/src/modules/Elsa.Workflows.Core/Models/ActivityHandle.cs +++ b/src/modules/Elsa.Workflows.Core/Models/ActivityHandle.cs @@ -5,12 +5,33 @@ namespace Elsa.Workflows.Models; /// public class ActivityHandle { - public static ActivityHandle FromActivityId(string activityId) => new() { ActivityId = activityId }; - public static ActivityHandle FromActivityNodeId(string activityNodeId) => new() { ActivityNodeId = activityNodeId }; - public static ActivityHandle FromActivityInstanceId(string activityInstanceId) => new() { ActivityInstanceId = activityInstanceId }; - public static ActivityHandle FromActivityHash(string activityHash) => new() { ActivityHash = activityHash }; + public static ActivityHandle FromActivityId(string activityId) => new() + { + ActivityId = activityId + }; + + public static ActivityHandle FromActivityNodeId(string activityNodeId) => new() + { + ActivityNodeId = activityNodeId + }; + + public static ActivityHandle FromActivityInstanceId(string activityInstanceId) => new() + { + ActivityInstanceId = activityInstanceId + }; + + public static ActivityHandle FromActivityHash(string activityHash) => new() + { + ActivityHash = activityHash + }; + public string? ActivityId { get; init; } - public string? ActivityNodeId { get; init;} - public string? ActivityInstanceId { get; init;} - public string? ActivityHash { get; init;} + public string? ActivityNodeId { get; init; } + public string? ActivityInstanceId { get; init; } + public string? ActivityHash { get; init; } + + public override string ToString() + { + return ActivityId ?? (ActivityNodeId ?? (ActivityInstanceId ?? (ActivityHash ?? ""))); + } } \ No newline at end of file