Ejemplo n.º 1
0
        protected override async ValueTask <IActivityExecutionResult> OnExecuteAsync(ActivityExecutionContext context)
        {
            var parentBlueprint = context.ActivityBlueprint.Parent;

            // Remove any blocking activities within the scope of the composite activity.
            var blockingActivities           = context.WorkflowExecutionContext.WorkflowInstance.BlockingActivities;
            var blockingActivityIds          = blockingActivities.Select(x => x.ActivityId).ToList();
            var containedBlockingActivityIds = parentBlueprint == null ? blockingActivityIds : parentBlueprint.Activities.Where(x => blockingActivityIds.Contains(x.Id)).Select(x => x.Id).ToList();
            var containedBlockingActivities  = blockingActivities.Where(x => containedBlockingActivityIds.Contains(x.ActivityId));

            foreach (var blockingActivity in containedBlockingActivities)
            {
                await context.WorkflowExecutionContext.RemoveBlockingActivityAsync(blockingActivity);
            }

            // Evict & remove any scope activities within the scope of the composite activity.
            var scopes   = context.WorkflowInstance.Scopes.Select(x => x).Reverse().ToList();
            var scopeIds = scopes.Select(x => x.ActivityId).ToList();
            var containedScopeActivityIds = parentBlueprint == null ? scopeIds : parentBlueprint.Activities.Where(x => scopeIds.Contains(x.Id)).Select(x => x.Id).ToList();

            foreach (var scopeId in containedScopeActivityIds)
            {
                var scopeActivity = context.WorkflowExecutionContext.GetActivityBlueprintById(scopeId) !;
                await context.WorkflowExecutionContext.EvictScopeAsync(scopeActivity);

                scopes.RemoveAll(x => x.ActivityId == scopeId);
            }

            context.WorkflowInstance.Scopes = new SimpleStack <ActivityScope>(scopes.AsEnumerable().Reverse());

            // Return output.
            Output = new FinishOutput(ActivityOutput, OutcomeNames);

            return(Noop());
        }
Ejemplo n.º 2
0
        protected override async ValueTask <IActivityExecutionResult> OnExecuteAsync(ActivityExecutionContext context)
        {
            var parentBlueprint = context.ActivityBlueprint.Parent;
            var isRoot          = parentBlueprint == null;

            // Remove any blocking activities within the scope of the composite activity.
            var blockingActivities           = context.WorkflowExecutionContext.WorkflowInstance.BlockingActivities;
            var blockingActivityIds          = blockingActivities.Select(x => x.ActivityId).ToList();
            var containedBlockingActivityIds = parentBlueprint == null ? blockingActivityIds : parentBlueprint.Activities.Where(x => blockingActivityIds.Contains(x.Id)).Select(x => x.Id).ToList();
            var containedBlockingActivities  = blockingActivities.Where(x => containedBlockingActivityIds.Contains(x.ActivityId));

            foreach (var blockingActivity in containedBlockingActivities)
            {
                await context.WorkflowExecutionContext.RemoveBlockingActivityAsync(blockingActivity);
            }

            // Evict & remove any scope activities within the scope of the composite activity.
            var scopes   = context.WorkflowInstance.Scopes.Select(x => x).Reverse().ToList();
            var scopeIds = scopes.Select(x => x.ActivityId).ToList();
            var containedScopeActivityIds = parentBlueprint == null ? scopeIds : parentBlueprint.Activities.Where(x => scopeIds.Contains(x.Id)).Select(x => x.Id).ToList();

            foreach (var scopeId in containedScopeActivityIds)
            {
                var scopeActivity = context.WorkflowExecutionContext.GetActivityBlueprintById(scopeId) !;
                await context.WorkflowExecutionContext.EvictScopeAsync(scopeActivity);

                scopes.RemoveAll(x => x.ActivityId == scopeId);
            }

            context.WorkflowInstance.Scopes = new SimpleStack <ActivityScope>(scopes.AsEnumerable().Reverse());

            // Return output.
            Output = new FinishOutput(ActivityOutput, OutcomeNames);
            context.LogOutputProperty(this, nameof(Output), Output);

            if (isRoot)
            {
                // Clear activity scheduler to prevent other scheduled activities from adding new blocking activities, which would prevent the workflow from completing.
                context.WorkflowExecutionContext.ClearScheduledActivities();
            }

            return(Noop());
        }