private void SetStateWithoutExecution(ActivityDefinition activityToSet, ProcessInstance processInstance) { SetProcessNewStatus(processInstance, ProcessStatus.Running); IEnumerable <TransitionDefinition> transitions; try { PersistenceProvider.FillSystemProcessParameters(processInstance); var from = processInstance.CurrentActivity; var to = activityToSet; PersistenceProvider.UpdatePersistenceState(processInstance, TransitionDefinition.Create(from, to)); } catch (Exception ex) { Logger.Log.Error(string.Format("Workflow Id={0}", processInstance.ProcessId), ex); throw; } finally { SetProcessNewStatus(processInstance, ProcessStatus.Idled); } }
public override IEnumerable <TransitionDefinition> ParseTransitions(XElement schemeMedium, IEnumerable <ActorDefinition> actorDefinitions, IEnumerable <CommandDefinition> commandDefinitions, IEnumerable <ActionDefinition> actionDefinitions, IEnumerable <ActivityDefinition> activityDefinitions, IEnumerable <TimerDefinition> timerDefinitions) { if (schemeMedium == null) { throw new ArgumentNullException("schemeMedium"); } if (commandDefinitions == null) { throw new ArgumentNullException("commandDefinitions"); } if (actionDefinitions == null) { throw new ArgumentNullException("actionDefinitions"); } if (activityDefinitions == null) { throw new ArgumentNullException("activityDefinitions"); } var transitionElements = schemeMedium.SingleOrDefault("Transitions"); if (transitionElements == null) { throw new ArgumentNullException(""); } var commandDefinitionsList = commandDefinitions.ToList(); var actionDefinitionsList = actionDefinitions.ToList(); var activityDefinitionsList = activityDefinitions.ToList(); var actorDefinitionsList = actorDefinitions.ToList(); var timerDefinitionsList = timerDefinitions.ToList(); var transitions = new List <TransitionDefinition>(); foreach (var transitionElement in transitionElements.Elements().ToList()) { var fromActivity = activityDefinitionsList.Single(ad => ad.Name == GetFrom(transitionElement)); var toActivity = activityDefinitionsList.Single(ad => ad.Name == GetTo(transitionElement)); TriggerDefinition trigger = null; var triggersElement = transitionElement.Element("Triggers"); if (triggersElement != null) { var triggerElement = triggersElement.Element("Trigger"); if (triggerElement != null) { trigger = TriggerDefinition.Create(GetType(triggerElement)); if (trigger.Type == TriggerType.Command) { (trigger as CommandTriggerDefinition).Command = commandDefinitionsList.Single(cd => cd.Name == GetNameRef(triggerElement)); } else if (trigger.Type == TriggerType.Timer) { (trigger as TimerTriggerDefinition).Timer = timerDefinitionsList.Single(cd => cd.Name == GetNameRef(triggerElement)); } } } ConditionDefinition condition = null; var conditionsElement = transitionElement.Element("Conditions"); if (conditionsElement != null) { var conditionElement = conditionsElement.Element("Condition"); if (conditionElement != null) { condition = !string.IsNullOrEmpty(GetNameRefNullable(conditionElement)) ? ConditionDefinition.Create(GetType(conditionElement), actionDefinitionsList.Single(ad => ad.Name == GetNameRef(conditionElement)), GetResultOnPreExecution(conditionElement)) : ConditionDefinition.Create(GetType(conditionElement), GetResultOnPreExecution(conditionElement)); } } var transition = TransitionDefinition.Create(GetName(transitionElement), GetClassifier(transitionElement), fromActivity, toActivity, trigger, condition); var restrictionsElement = transitionElement.Element("Restrictions"); if (restrictionsElement != null) { foreach (var element in restrictionsElement.Elements("Restriction")) { transition.AddRestriction(RestrictionDefinition.Create(GetType(element), actorDefinitionsList.Single(ad => ad.Name == GetNameRef(element)))); } } var onErrorsElement = transitionElement.Element("OnErrors"); if (onErrorsElement != null) { foreach (var element in onErrorsElement.Elements("OnError")) { //TODO Only One Type Of OnErrorHandler transition.AddOnError(OnErrorDefinition.CreateSetActivityOnError(GetName(element), GetNameRef(element), GetPriority(element), GetTypeName(element) /*, GetIsExecuteImplementation(element),GetIsRethrow(element)*/)); } } transitions.Add(transition); } return(transitions); }
//通过注入的规则(IWorkflowBus),方法执行完成后调用本方法。 internal void BusExecutionComplete(object sender, ExecutionResponseEventArgs e) { var executionResponseParameters = e.Parameters; var processInstance = Builder.GetProcessInstance(executionResponseParameters.ProcessId); PersistenceProvider.FillSystemProcessParameters(processInstance); //TODO Сделать метод филл CurrentActivity if (executionResponseParameters.IsEmplty) { SetProcessNewStatus(processInstance, ProcessStatus.Idled); //var timerTransitions = // processInstance.ProcessScheme.GetTimerTransitionForActivity(processInstance.CurrentActivity).ToList(); //timerTransitions.ForEach(p=>_runtimeTimer.UpdateTimer(processInstance.ProcessId,p.Trigger.Timer)); return; } if (executionResponseParameters.IsError) { var executionErrorParameters = executionResponseParameters as ExecutionResponseParametersError; Logger.Log.Error(string.Format("Error Execution Complete Workflow Id={0}", processInstance.ProcessId), executionErrorParameters.Exception); if (string.IsNullOrEmpty(executionErrorParameters.ExecutedTransitionName)) { SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw executionErrorParameters.Exception; } var transition = processInstance.ProcessScheme.FindTransition(executionErrorParameters.ExecutedTransitionName); var onErrorDefinition = transition.OnErrors.Where( oe => executionErrorParameters.Exception.GetType().Equals(oe.ExceptionType)). OrderBy(oe => oe.Priority).FirstOrDefault() ?? transition.OnErrors.Where( oe => oe.ExceptionType.IsAssignableFrom(executionErrorParameters.Exception.GetType())). OrderBy(oe => oe.Priority).FirstOrDefault(); if (onErrorDefinition == null) { SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw executionErrorParameters.Exception; } if (onErrorDefinition.ActionType == OnErrorActionType.SetActivity) { var from = processInstance.CurrentActivity; var to = processInstance.ProcessScheme.FindActivity((onErrorDefinition as SetActivityOnErrorDefinition).NameRef); PersistenceProvider.UpdatePersistenceState(processInstance, TransitionDefinition.Create(from, to)); SetProcessNewStatus(processInstance, ProcessStatus.Idled); } throw executionErrorParameters.Exception; //return; } try { ActivityDefinition newCurrentActivity; if (string.IsNullOrEmpty(executionResponseParameters.ExecutedTransitionName)) { if (executionResponseParameters.ExecutedActivityName == processInstance.ProcessScheme.InitialActivity.Name) { newCurrentActivity = processInstance.ProcessScheme.InitialActivity; } else { var from = processInstance.CurrentActivity; var to = processInstance.ProcessScheme.FindActivity(executionResponseParameters.ExecutedActivityName); newCurrentActivity = to; PersistenceProvider.UpdatePersistenceState(processInstance, TransitionDefinition.Create(from, to)); } } else { var executedTransition = processInstance.ProcessScheme.FindTransition(executionResponseParameters.ExecutedTransitionName); newCurrentActivity = executedTransition.To; PersistenceProvider.UpdatePersistenceState(processInstance, executedTransition); } FillParameters(processInstance, (executionResponseParameters as ExecutionResponseParametersComplete)); PersistenceProvider.SavePersistenceParameters(processInstance); var autoTransitions = processInstance.ProcessScheme.GetAutoTransitionForActivity(newCurrentActivity).ToList(); if (autoTransitions.Count() < 1) { SetProcessNewStatus(processInstance, newCurrentActivity.IsFinal ? ProcessStatus.Finalized : ProcessStatus.Idled); //var timerTransitions = //processInstance.ProcessScheme.GetTimerTransitionForActivity(newCurrentActivity).ToList(); //timerTransitions.ForEach(p => _runtimeTimer.SetTimer(processInstance.ProcessId, p.Trigger.Timer)); return; } PersistenceProvider.FillProcessParameters(processInstance); var newExecutionParameters = new List <ExecutionRequestParameters>(); newExecutionParameters.AddRange( autoTransitions.Select( at => ExecutionRequestParameters.Create(processInstance.ProcessId, processInstance.ProcessParameters, at))); Bus.QueueExecution(newExecutionParameters); } catch (ActivityNotFoundException) { SetProcessNewStatus(processInstance, ProcessStatus.Terminated); } //TODO Обработка ошибок catch (Exception ex) { Logger.Log.Error(string.Format("Error Execution Complete Workflow Id={0}", processInstance.ProcessId), ex); SetProcessNewStatus(processInstance, ProcessStatus.Idled); } }