예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        //通过注入的规则(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);
            }
        }