Update handling of null outcomes in activity execution

The code was adjusted to correctly handle cases when the method `GetBackgroundOutcomes` returns null. This would cause the activity to complete prematurely.

Fixes #4763
This commit is contained in:
Sipke Schoorstra 2024-01-07 16:20:02 +01:00
parent 900aac6d56
commit c2ec2bda5a
2 changed files with 6 additions and 4 deletions

View file

@ -40,9 +40,9 @@ public static class BackgroundActivityExecutionContextExtensions
/// <summary>
/// Gets the background outcomes.
/// </summary>
public static IEnumerable<string> GetBackgroundOutcomes(this ActivityExecutionContext activityExecutionContext)
public static IEnumerable<string>? GetBackgroundOutcomes(this ActivityExecutionContext activityExecutionContext)
{
return activityExecutionContext.GetProperty<IEnumerable<string>>("BackgroundOutcomes") ?? Enumerable.Empty<string>();
return activityExecutionContext.GetProperty<IEnumerable<string>>("BackgroundOutcomes");
}
/// <summary>

View file

@ -110,7 +110,7 @@ public class DefaultBackgroundActivityInvoker : IBackgroundActivityInvoker
var outcomesKey = BackgroundActivityInvokerMiddleware.GetBackgroundActivityOutcomesKey(activityNodeId);
var journalDataKey = BackgroundActivityInvokerMiddleware.GetBackgroundActivityJournalDataKey(activityNodeId);
var scheduledActivitiesKey = BackgroundActivityInvokerMiddleware.GetBackgroundActivityScheduledActivitiesKey(activityNodeId);
var outcomes = activityExecutionContext.GetBackgroundOutcomes().ToList();
var outcomes = activityExecutionContext.GetBackgroundOutcomes()?.ToList();
var scheduledActivities = activityExecutionContext.GetBackgroundScheduledActivities().ToList();
var dispatchRequest = new DispatchWorkflowInstanceRequest
@ -119,13 +119,15 @@ public class DefaultBackgroundActivityInvoker : IBackgroundActivityInvoker
BookmarkId = bookmarkId,
Properties = new Dictionary<string, object>
{
[outcomesKey] = outcomes,
[scheduledActivitiesKey] = JsonSerializer.Serialize(scheduledActivities),
[inputKey] = outputValues,
[journalDataKey] = activityExecutionContext.JournalData
}
};
if (outcomes != null)
dispatchRequest.Properties[outcomesKey] = outcomes;
if (cancellationToken.IsCancellationRequested)
{
_logger.LogInformation("Background execution for activity {ActivityNodeId} was canceled", activityNodeId);