Always refresh workflow context when context ID has changed using SetContextId activity

This commit is contained in:
Sipke Schoorstra 2020-12-03 20:01:23 +01:00
parent 43cfe431f1
commit a3eb17b0ac
3 changed files with 7 additions and 1 deletions

View file

@ -36,6 +36,7 @@ namespace Elsa.Services.Models
public bool HasPostScheduledActivities => WorkflowInstance.PostScheduledActivities.Any();
public IWorkflowFault? WorkflowFault { get; private set; }
public bool IsFirstPass { get; private set; }
public bool ContextHasChanged { get; set; }
public void ScheduleActivities(IEnumerable<string> activityIds, object? input = default)
{

View file

@ -19,7 +19,9 @@ namespace Elsa.Activities.Primitives
protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context)
{
var originalContextId = context.WorkflowExecutionContext.WorkflowInstance.ContextId;
context.WorkflowExecutionContext.WorkflowInstance.ContextId = ContextId;
context.WorkflowExecutionContext.ContextHasChanged = ContextId != originalContextId;
return Done();
}
}

View file

@ -271,8 +271,11 @@ namespace Elsa.Services
var currentActivityId = scheduledActivity.ActivityId;
var activityBlueprint = workflowBlueprint.GetActivity(currentActivityId)!;
if (workflowBlueprint.ContextOptions?.ContextFidelity == WorkflowContextFidelity.Activity || activityBlueprint.LoadWorkflowContext)
if (workflowBlueprint.ContextOptions?.ContextFidelity == WorkflowContextFidelity.Activity || activityBlueprint.LoadWorkflowContext || workflowExecutionContext.ContextHasChanged)
{
workflowExecutionContext.WorkflowContext = await LoadWorkflowContextAsync(workflowExecutionContext, WorkflowContextFidelity.Activity, activityBlueprint.LoadWorkflowContext, cancellationToken);
workflowExecutionContext.ContextHasChanged = false;
}
var activityExecutionContext = new ActivityExecutionContext(scope, workflowExecutionContext, activityBlueprint, scheduledActivity.Input, cancellationToken);
var activity = await activityExecutionContext.ActivateActivityAsync(cancellationToken);