diff --git a/Elsa.sln.DotSettings b/Elsa.sln.DotSettings index 0ea8896b9..05601a597 100644 --- a/Elsa.sln.DotSettings +++ b/Elsa.sln.DotSettings @@ -10,4 +10,5 @@ True True True - True \ No newline at end of file + True + True \ No newline at end of file diff --git a/src/modules/Elsa.JavaScript/Services/JintJavaScriptEvaluator.cs b/src/modules/Elsa.JavaScript/Services/JintJavaScriptEvaluator.cs index 56d38b6a0..557851197 100644 --- a/src/modules/Elsa.JavaScript/Services/JintJavaScriptEvaluator.cs +++ b/src/modules/Elsa.JavaScript/Services/JintJavaScriptEvaluator.cs @@ -132,7 +132,11 @@ public class JintJavaScriptEvaluator : IJavaScriptEvaluator return; var inputs = context.GetWorkflowInputs().ToDictionary(x => x.Name); - var inputDefinitions = context.GetWorkflowExecutionContext().Workflow.Inputs; + + if (!context.TryGetWorkflowExecutionContext(out var workflowExecutionContext)) + return; + + var inputDefinitions = workflowExecutionContext.Workflow.Inputs; foreach (var inputDefinition in inputDefinitions) { diff --git a/src/modules/Elsa.Quartz/Services/QuartzWorkflowScheduler.cs b/src/modules/Elsa.Quartz/Services/QuartzWorkflowScheduler.cs index 14407ce3f..57703adf9 100644 --- a/src/modules/Elsa.Quartz/Services/QuartzWorkflowScheduler.cs +++ b/src/modules/Elsa.Quartz/Services/QuartzWorkflowScheduler.cs @@ -47,7 +47,9 @@ public class QuartzWorkflowScheduler : IWorkflowScheduler .WithIdentity(taskName) .StartAt(at) .Build(); - await scheduler.ScheduleJob(trigger, cancellationToken); + + if(!await scheduler.CheckExists(trigger.Key, cancellationToken)) + await scheduler.ScheduleJob(trigger, cancellationToken); } /// @@ -77,7 +79,9 @@ public class QuartzWorkflowScheduler : IWorkflowScheduler .StartAt(startAt) .WithSimpleSchedule(schedule => schedule.WithInterval(interval).RepeatForever()) .Build(); - await scheduler.ScheduleJob(trigger, cancellationToken); + + if(!await scheduler.CheckExists(trigger.Key, cancellationToken)) + await scheduler.ScheduleJob(trigger, cancellationToken); } /// @@ -99,7 +103,9 @@ public class QuartzWorkflowScheduler : IWorkflowScheduler .UsingJobData(CreateJobDataMap(request)) .WithIdentity(taskName) .WithCronSchedule(cronExpression).Build(); - await scheduler.ScheduleJob(trigger, cancellationToken); + + if(!await scheduler.CheckExists(trigger.Key, cancellationToken)) + await scheduler.ScheduleJob(trigger, cancellationToken); } /// diff --git a/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.Cancel.cs b/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.Cancel.cs index 3732bfeea..19882ba13 100644 --- a/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.Cancel.cs +++ b/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.Cancel.cs @@ -36,9 +36,10 @@ public partial class ActivityExecutionContext // Add an execution log entry. AddExecutionLogEntry("Canceled", payload: JournalData, includeActivityState: true); - _cancellationRegistration.Dispose(); - + await _cancellationRegistration.DisposeAsync(); await this.SendSignalAsync(new CancelSignal()); + + // ReSharper disable once MethodSupportsCancellation await _publisher.SendAsync(new ActivityCancelled(this)); } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Extensions/ExpressionExecutionContextExtensions.cs b/src/modules/Elsa.Workflows.Core/Extensions/ExpressionExecutionContextExtensions.cs index e594dd0e6..385d5477a 100644 --- a/src/modules/Elsa.Workflows.Core/Extensions/ExpressionExecutionContextExtensions.cs +++ b/src/modules/Elsa.Workflows.Core/Extensions/ExpressionExecutionContextExtensions.cs @@ -310,12 +310,23 @@ public static class ExpressionExecutionContextExtensions while (currentScope != null) { if (!currentScope.TryGetActivityExecutionContext(out var activityExecutionContext)) - break; + { + var variables = currentScope.Memory.Blocks.Values + .Where(x => x.Metadata is VariableBlockMetadata) + .Select(x => x.Metadata as VariableBlockMetadata) + .Select(x => x!.Variable) + .ToList(); - var variables = activityExecutionContext.Variables; + foreach (var variable in variables) + yield return variable; + } + else + { + var variables = activityExecutionContext.Variables; - foreach (var variable in variables) - yield return variable; + foreach (var variable in variables) + yield return variable; + } currentScope = currentScope.ParentContext; } @@ -413,7 +424,10 @@ public static class ExpressionExecutionContextExtensions foreach (var output in activityDescriptor.Outputs) { var outputPascalName = output.Name.Pascalize(); - yield return new ActivityOutputs(activity.Id, activityIdPascalName, new[] { outputPascalName }); + yield return new ActivityOutputs(activity.Id, activityIdPascalName, new[] + { + outputPascalName + }); } } } @@ -486,7 +500,7 @@ public static class ExpressionExecutionContextExtensions // If this is an async enumerable, return as-is. if (obj.GetType().Name == "AsyncIListEnumerableAdapter`1") return obj; - + // Use LINQ to convert the IEnumerable to an array. var elementType = obj.GetType().GetGenericArguments().FirstOrDefault(); @@ -494,6 +508,9 @@ public static class ExpressionExecutionContextExtensions return obj; var toArrayMethod = typeof(Enumerable).GetMethod("ToArray")!.MakeGenericMethod(elementType); - return toArrayMethod.Invoke(null, new object[] { enumerable })!; + return toArrayMethod.Invoke(null, new object[] + { + enumerable + })!; } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Services/WorkflowStateExtractor.cs b/src/modules/Elsa.Workflows.Core/Services/WorkflowStateExtractor.cs index 942d8931b..9d95a4d4c 100644 --- a/src/modules/Elsa.Workflows.Core/Services/WorkflowStateExtractor.cs +++ b/src/modules/Elsa.Workflows.Core/Services/WorkflowStateExtractor.cs @@ -253,14 +253,9 @@ public class WorkflowStateExtractor : IWorkflowStateExtractor private static IEnumerable GetActiveActivityExecutionContexts(IEnumerable activityExecutionContexts) { - var contexts = activityExecutionContexts.ToList(); - - // // If there are any faulted contexts, keep everything so that the user can fix the issue and potentially reschedule existing instances. - // if (contexts.Any(x => x.Status == ActivityStatus.Faulted)) - return contexts; - - // return contexts - // .Where(x => !x.IsCompleted) - // .ToList(); + // Filter out completed activity execution contexts. + // This will currently break scripts accessing activity output directly, but there's a workaround for that via variable capturing. + // We may ultimately restore direct output access, but in a different way. + return activityExecutionContexts.Where(x => !x.IsCompleted).ToList(); } } \ No newline at end of file diff --git a/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListsAndArrays/Tests.cs b/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListsAndArrays/Tests.cs index 0b02ed905..e0302646a 100644 --- a/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListsAndArrays/Tests.cs +++ b/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListsAndArrays/Tests.cs @@ -1,12 +1,8 @@ -using System; -using System.Collections.Generic; using System.Dynamic; -using System.Threading.Tasks; using Elsa.Expressions.Models; using Elsa.Extensions; using Elsa.JavaScript.Contracts; using Elsa.Testing.Shared; -using Jint; using Microsoft.Extensions.DependencyInjection; using Xunit; using Xunit.Abstractions;