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;