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)); }
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)); }