public void QueueExecution(IEnumerable<ExecutionRequestParameters> requestParameters) { var executor = new ActivityExecutor(); var response = executor.Execute(requestParameters); if (ExecutionComplete != null) { var args = new ExecutionResponseEventArgs(response); ExecutionComplete(this,args); } }
public void QueueExecution(IEnumerable <ExecutionRequestParameters> requestParameters) { var executor = new ActivityExecutor(); var response = executor.Execute(requestParameters); if (ExecutionComplete != null) { var args = new ExecutionResponseEventArgs(response); ExecutionComplete(this, args); } }
public void PreExecute(Guid processId) { var processInstance = Builder.GetProcessInstance(processId); //从这里分析什么是SystemProcessParameters,系统参数 PersistenceProvider.FillSystemProcessParameters(processInstance); var activity = processInstance.ProcessScheme.FindActivity(processInstance.CurrentActivityName); var currentActivity = processInstance.ProcessScheme.InitialActivity; if (activity.State != currentActivity.State) return; //TODO Workflow Temporary var executor = new ActivityExecutor(true); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterProcessId, processId)); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterSchemeId, processInstance.SchemeId)); if (currentActivity.HavePreExecutionImplementation) { var response = executor.Execute(new List<ExecutionRequestParameters> { ExecutionRequestParameters.Create(processInstance.ProcessId, processInstance.ProcessParameters, processInstance.ProcessScheme.InitialActivity, ConditionDefinition.Always, true) }); if (PreExecuteProcessResponse(processInstance, response)) return; } do { if (!string.IsNullOrEmpty(currentActivity.State)) processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterCurrentState, (object)currentActivity.State)); var transitions = processInstance.ProcessScheme.GetPossibleTransitionsForActivity(currentActivity).Where(t => t.Classifier == TransitionClassifier.Direct); currentActivity = null; var autotransitions = transitions.Where(t => t.Trigger.Type == TriggerType.Auto); var newExecutionParameters = FillExecutionRequestParameters(processId, processInstance, autotransitions); if (newExecutionParameters.Count > 0) { var response = executor.Execute(newExecutionParameters); if (!PreExecuteProcessResponse(processInstance, response)) { currentActivity = processInstance.ProcessScheme.FindTransition(response.ExecutedTransitionName).To; } } if (currentActivity == null) { var commandTransitions = transitions.Where(t => t.Trigger.Type == TriggerType.Command); if (commandTransitions.Count(t => t.Condition.Type == ConditionType.Always && !t.Condition.ResultOnPreExecution.HasValue) < 2) //Это не является ошибкой валидациии при разных командах { newExecutionParameters = FillExecutionRequestParameters(processId, processInstance, commandTransitions); if (newExecutionParameters.Count > 0) { var response = executor.Execute(newExecutionParameters); if (!PreExecuteProcessResponse(processInstance, response)) { currentActivity = processInstance.ProcessScheme.FindTransition(response.ExecutedTransitionName).To; } } } } } while (currentActivity != null && !currentActivity.IsFinal); }
internal void ExecuteTimer(Guid processId, string timerName) { ProcessInstance processInstance = this.Builder.GetProcessInstance(processId); this.PersistenceProvider.FillProcessParameters(processInstance); TransitionDefinition transitionDefinition = processInstance.ProcessScheme.GetTimerTransitionForActivity(processInstance.CurrentActivity, ForkTransitionSearchType.Both).FirstOrDefault<TransitionDefinition>((TransitionDefinition p) => p.Trigger.Timer.Name == timerName); if (transitionDefinition != null) { try { this.SetProcessNewStatus(processInstance, ProcessStatus.Running); processInstance.ExecutedTimer = timerName; processInstance.CurrentCommand = DefaultDefinitions.CommandTimer.Name; processInstance.IdentityId = null; processInstance.ImpersonatedIdentityId = null; List<ExecutionRequestParameters> executionRequestParameters = new List<ExecutionRequestParameters>() { ExecutionRequestParameters.Create(processInstance, transitionDefinition) }; if (!transitionDefinition.IsFork) { processInstance.SetStartTransitionalProcessActivity(); this.Bus.QueueExecution(executionRequestParameters); } else { ActivityExecutor activityExecutor = new ActivityExecutor(this, false); executionRequestParameters.ForEach((ExecutionRequestParameters p) => p.Methods = new ActionDefinitionReference[0]); ExecutionResponseParameters executionResponseParameter = activityExecutor.Execute(executionRequestParameters); if (!this.PreExecuteProcessResponse(executionResponseParameter)) { TransitionDefinition transitionDefinition1 = processInstance.ProcessScheme.FindTransition(executionResponseParameter.ExecutedTransitionName); this.CreateSubprocesses(processInstance, new List<TransitionDefinition>() { transitionDefinition1 }, null); } this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); } } catch (Exception exception1) { Exception exception = exception1; this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw new Exception(string.Format("Error Timer Complete Workflow Id={0}", processInstance.ProcessId), exception); } } }
public void ExecuteCommand(WorkflowCommand command, string identityId, string impersonatedIdentityId) { IEnumerable<TransitionDefinition> list; ProcessInstance processInstance = this.Builder.GetProcessInstance(command.ProcessId); this.SetProcessNewStatus(processInstance, ProcessStatus.Running); try { this.PersistenceProvider.FillSystemProcessParameters(processInstance); if (processInstance.CurrentActivityName != command.ValidForActivityName) { throw new InvalidOperationException(string.Format("Impossible to execute command {0} valid for activity {1}. Current activity {2}.", command.CommandName, command.ValidForActivityName, processInstance.CurrentActivityName)); } list = processInstance.ProcessScheme.GetCommandTransitionForActivity(processInstance.CurrentActivity, command.CommandName, ForkTransitionSearchType.Both).ToList<TransitionDefinition>(); if (!list.Any<TransitionDefinition>()) { throw new InvalidOperationException(); } } catch (Exception exception) { this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw; } try { foreach (CommandParameter parameter in command.Parameters) { ParameterDefinition parameterDefinition = processInstance.ProcessScheme.FindParameterDefinition(parameter.ParameterName); if (parameterDefinition == null) { continue; } processInstance.AddParameter(ParameterDefinition.Create(parameterDefinition, parameter.Value)); } processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterCurrentCommand, command.CommandName)); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterIdentityId, identityId)); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterImpersonatedIdentityId, impersonatedIdentityId)); this.PersistenceProvider.SavePersistenceParameters(processInstance); this.PersistenceProvider.FillPersistedProcessParameters(processInstance); } catch (Exception exception1) { this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw; } List<TransitionDefinition> transitionDefinitions = ( from t in list where t.IsFork select t).ToList<TransitionDefinition>(); List<TransitionDefinition> list1 = ( from t in list where !t.IsFork select t).ToList<TransitionDefinition>(); if (transitionDefinitions.Any<TransitionDefinition>()) { ActivityExecutor activityExecutor = new ActivityExecutor(this, false); try { List<ExecutionRequestParameters> executionRequestParameters = new List<ExecutionRequestParameters>(); executionRequestParameters.AddRange( from at in transitionDefinitions select ExecutionRequestParameters.Create(processInstance, at)); executionRequestParameters.ForEach((ExecutionRequestParameters p) => p.Methods = new ActionDefinitionReference[0]); ExecutionResponseParameters executionResponseParameter = activityExecutor.Execute(executionRequestParameters); if (!this.PreExecuteProcessResponse(executionResponseParameter)) { TransitionDefinition transitionDefinition = processInstance.ProcessScheme.FindTransition(executionResponseParameter.ExecutedTransitionName); this.CreateSubprocesses(processInstance, new List<TransitionDefinition>() { transitionDefinition }, null); } if (!list1.Any<TransitionDefinition>()) { this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); } } catch (Exception exception3) { Exception exception2 = exception3; this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw new Exception(string.Format("Error Execute Command Workflow Id={0}", processInstance.ProcessId), exception2); } } if (list1.Any<TransitionDefinition>()) { try { processInstance.SetStartTransitionalProcessActivity(); List<ExecutionRequestParameters> executionRequestParameters1 = new List<ExecutionRequestParameters>(); executionRequestParameters1.AddRange( from at in list1 select ExecutionRequestParameters.Create(processInstance, at)); this.Bus.QueueExecution(executionRequestParameters1); } catch (Exception exception5) { Exception exception4 = exception5; this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw new Exception(string.Format("Error Execute Command Workflow Id={0}", processInstance.ProcessId), exception4); } } }
private void PreExecute(Guid processId, string fromActivityName, bool ignoreCurrentStateCheck, ProcessInstance processInstance) { this.PersistenceProvider.FillPersistedProcessParameters(processInstance); ActivityDefinition activityDefinition = processInstance.ProcessScheme.FindActivity(processInstance.CurrentActivityName); ActivityDefinition to = processInstance.ProcessScheme.FindActivity(fromActivityName); if (!ignoreCurrentStateCheck && activityDefinition.State != to.State) { return; } ActivityExecutor activityExecutor = new ActivityExecutor(this, true); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterProcessId, processId)); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterSchemeId, processInstance.SchemeId)); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterIsPreExecution, true)); WorkflowRuntime.PreExecutionContext preExecutionContext = new WorkflowRuntime.PreExecutionContext(); do { if (!string.IsNullOrEmpty(to.State)) { processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterCurrentState, to.State)); } IEnumerable<TransitionDefinition> transitionDefinitions = processInstance.ProcessScheme.GetPossibleTransitionsForActivity(to, ForkTransitionSearchType.NotFork).Where<TransitionDefinition>((TransitionDefinition t) => { if (t.Classifier != TransitionClassifier.Direct) { return false; } return t.Trigger.Type != TriggerType.Timer; }); to = null; List<TransitionDefinition> list = ( from t in transitionDefinitions where t.Trigger.Type == TriggerType.Auto select t).ToList<TransitionDefinition>(); List<TransitionDefinition> list1 = ( from t in transitionDefinitions where t.Trigger.Type == TriggerType.Command select t).ToList<TransitionDefinition>(); List<ExecutionRequestParameters> executionRequestParameters = this.FillExecutionRequestParameters(processId, processInstance, list, preExecutionContext, list1); if (executionRequestParameters.Count > 0) { ExecutionResponseParameters executionResponseParameter = activityExecutor.Execute(executionRequestParameters); if (!this.PreExecuteProcessResponse(executionResponseParameter)) { to = processInstance.ProcessScheme.FindTransition(executionResponseParameter.ExecutedTransitionName).To; } } if (to != null) { continue; } if (list1.Count<TransitionDefinition>((TransitionDefinition t) => { if (!t.IsAlwaysTransition) { return false; } return !t.Conditions.First<ConditionDefinition>().ResultOnPreExecution.HasValue; }) >= 2) { continue; } executionRequestParameters = this.FillExecutionRequestParameters(processId, processInstance, list1, preExecutionContext, null); if (executionRequestParameters.Count <= 0) { continue; } ExecutionResponseParameters executionResponseParameter1 = activityExecutor.Execute(executionRequestParameters); if (this.PreExecuteProcessResponse(executionResponseParameter1)) { continue; } to = processInstance.ProcessScheme.FindTransition(executionResponseParameter1.ExecutedTransitionName).To; } while (to != null && !to.IsFinal); }