diff --git a/src/modules/Elsa.Workflows.Runtime/Activities/BulkDispatchWorkflows.cs b/src/modules/Elsa.Workflows.Runtime/Activities/BulkDispatchWorkflows.cs index 9907ba696..485dc5639 100644 --- a/src/modules/Elsa.Workflows.Runtime/Activities/BulkDispatchWorkflows.cs +++ b/src/modules/Elsa.Workflows.Runtime/Activities/BulkDispatchWorkflows.cs @@ -106,6 +106,8 @@ public class BulkDispatchWorkflows : Activity /// [Port] public IActivity? ChildFaulted { get; set; } + + private List _errors = new List(); /// protected override async ValueTask ExecuteAsync(ActivityExecutionContext context) @@ -116,8 +118,16 @@ public class BulkDispatchWorkflows : Activity await foreach (var item in items) { - await ProcessItem(context, item); - dispatchedInstancesCount++; + var dispatchedSuccessful = await ProcessItem(context, item); + if (dispatchedSuccessful) + { + dispatchedInstancesCount++; + } + } + + if (_errors.Count > 1) + { + context.JournalData.Add("Error", _errors); } context.SetProperty(DispatchedInstancesCountKey, dispatchedInstancesCount); @@ -145,19 +155,22 @@ public class BulkDispatchWorkflows : Activity } } - private async Task ProcessItem(ActivityExecutionContext context, object item) + private async Task ProcessItem(ActivityExecutionContext context, object item) { try { await DispatchChildWorkflowAsync(context, item); + return true; } catch (TaskCanceledException) { await context.CompleteActivityWithOutcomesAsync("Canceled"); + return false; } catch (Exception ex) { - context.JournalData.Add("Error", ex.Message); + _errors.Add(ex.Message); + return false; } } @@ -173,18 +186,19 @@ public class BulkDispatchWorkflows : Activity ["ParentInstanceId"] = parentInstanceId }; - var itemAsInputDictionary = item as IDictionary ?? new Dictionary + var itemDictionary = new Dictionary { [defaultInputItemKey] = item }; var evaluatorOptions = new ExpressionEvaluatorOptions { - Arguments = itemAsInputDictionary + Arguments = itemDictionary }; + var inputDictionary = item as IDictionary ?? new Dictionary(); input["ParentInstanceId"] = parentInstanceId; - input.Merge(itemAsInputDictionary); + input.Merge(inputDictionary); var workflowDispatcher = context.GetRequiredService(); var identityGenerator = context.GetRequiredService();