Esempio n. 1
0
        private async Task <ActivityExecutionResult> ExecuteSynchronousActivities(StateExecutionContext stateExecutionContext, CancellationToken cancellationToken = default)
        {
            // take only synchronous activities in order they are defined in configuration
            var synchronousActivities = stateExecutionContext.StateConfiguration.Activities
                                        .Where(a => a.Type == ActivityTypeConfiguration.Synchronous)
                                        .ToList();

            if (synchronousActivities.Any())
            {
                foreach (var activityConfiguration in synchronousActivities)
                {
                    var activityExecutionContext = new ActivityExecutionContext(
                        stateExecutionContext, activityConfiguration);

                    var activityExecutionResult = await _activityProcessor.Process(activityExecutionContext, cancellationToken).ConfigureAwait(false);

                    if (activityExecutionResult.Status == ActivityExecutionStatus.Failed || activityExecutionResult.Status == ActivityExecutionStatus.FailedNoRetry)
                    {
                        return(activityExecutionResult);
                    }
                }
            }
            else
            {
                Log.Verbose("State [{state}] does not have any synchronous activity to execute [{workflowInstanceId}]",
                            stateExecutionContext.StateConfiguration.Code, stateExecutionContext.WorkflowContext.WorkflowInstance.Id);
            }

            return(new ActivityExecutionResult(ActivityExecutionStatus.Completed));
        }
Esempio n. 2
0
        public GraphConfig Process(bool withCriticalPath)
        {
            Schedule upperSchedule;
            Schedule lowerSchedule;

            var activities = _repository.GetActivities();
            var link       = _repository.GetLink();

            var upwardActivities   = activities.Where(a => a.Section == ActivitySection.UPWARD);
            var downwardActivities = activities.Where(a => a.Section == ActivitySection.DOWNWARD);

            upperSchedule = _activityProcessor.Calculate(upwardActivities);
            lowerSchedule = _activityProcessor.Calculate(downwardActivities);

            if (withCriticalPath)
            {
                var startingUpwardActivity   = GetStartingActivity(upwardActivities);
                var endingUpwardActivity     = GetEndingActivity(upwardActivities);
                var downwardStartingActivity = GetStartingActivity(downwardActivities);
                var endingDownwardActivity   = GetEndingActivity(downwardActivities);

                if (link != null && link.DownwardAct != null && link.UpwardAct != null)
                {
                    endingUpwardActivity     = link.UpwardAct;
                    downwardStartingActivity = link.DownwardAct;
                }

                upperSchedule = _activityProcessor.Process(upwardActivities, startingUpwardActivity,
                                                           endingUpwardActivity);
                lowerSchedule = _activityProcessor.Process(downwardActivities, downwardStartingActivity,
                                                           endingDownwardActivity);

                if (link != null)
                {
                    _linkProcessor.Process(activities, link, ref upperSchedule, ref lowerSchedule);
                }
            }

            return(_graphProcessor.ProcessGraph(withCriticalPath, upperSchedule, lowerSchedule));
        }