Пример #1
0
        public async Task Execute(EngineStepTracer tracer, CancellationToken token)
        {
            this.engineRef.RunManager.CurrentActivity = this.activityDefinition;
            this.engineRef.CurrentActivityStatus      = ActivityStatusOptions.Action_Running;

            //execute action
            //IAction<TModel> toExecute = this.engineRef.ImplementationManager.GetAction(this.activityDefinition.Action.Id);



            StepTraceNode <ActivityProcess> mark = this.engineRef.Tracer.CurrentStep = this.engineRef.Tracer.TraceStep(
                new ActivityProcess(this.activityDefinition.Id, ActivityStatusOptions.Activity_Running, null));


            //try
            //{
            //    Stopwatch t = new Stopwatch(); t.Start();
            //    this.engineRef.Tracer.TraceStep(
            //        new ActivityProcess(this.activityDefinition.Action.Id, ActivityStatusOptions.Action_Running, null));

            //    result = await toExecute.CompleteAsync(this.engineRef, new WorkflowEngineTrace(this.engineRef.Tracer), token);

            //    t.Stop();

            //    this.engineRef.CurrentActivityStatus = ActivityStatusOptions.Action_Completed;
            //    this.engineRef.Tracer.TraceStep(new ActivityProcess(this.activityDefinition.Action.Id, ActivityStatusOptions.Action_Completed, null, t.Elapsed));

            //}
            //catch (System.Exception ex)
            //{
            //    this.engineRef.CurrentActivityStatus = ActivityStatusOptions.Action_Failed;
            //    this.engineRef.Tracer.TraceStep(new ActivityProcess(this.activityDefinition.Action.Id, ActivityStatusOptions.Action_Failed, ex.Message));
            //}



            //if i have reactions, loop through each and run
            if (this.Reactions.Count > 0)
            {
                StepTraceNode <ActivityProcess> reactionMark = this.engineRef.Tracer.CurrentStep = this.engineRef.Tracer.TraceStep(
                    new ActivityProcess(this.activityDefinition.Id, ActivityStatusOptions.Action_Reacting, "React"));
                foreach (Reaction <TModel> react in this.Reactions)
                {
                    if (react.Activity != null)
                    {
                        this.engineRef.Tracer.CurrentStep = this.engineRef.Tracer.TraceStep(reactionMark,
                                                                                            new ActivityProcess(react.Activity.activityDefinition.Id, ActivityStatusOptions.Action_Reacting, "Evaluating"));
                        bool doReact = await this.engineRef.Evaluate(react.LogicEquationId, token);

                        if (doReact)
                        {
                            this.engineRef.Tracer.CurrentStep = this.engineRef.Tracer.TraceStep(reactionMark,
                                                                                                new ActivityProcess(react.Activity.activityDefinition.Id, ActivityStatusOptions.Action_Reacting, "Reacting"));
                            await react.Activity.Execute(this.engineRef.Tracer, token);
                        }
                    }
                    else
                    {
                        this.engineRef.Tracer.CurrentStep = this.engineRef.Tracer.TraceStep(reactionMark,
                                                                                            new ActivityProcess(react.Action.Id, ActivityStatusOptions.Action_Reacting, "Evaluating"));
                        bool doReact = await this.engineRef.Evaluate(react.LogicEquationId, token);

                        if (doReact)
                        {
                            IAction <TModel> reactionToExecute = this.engineRef.ImplementationManager.GetAction(
                                new Define.ActionDefinition()
                            {
                                Id = react.Action.Id
                            });
                            this.engineRef.Tracer.CurrentStep = this.engineRef.Tracer.TraceStep(reactionMark,
                                                                                                new ActivityProcess(react.Action.Id, ActivityStatusOptions.Action_Running, "Reacting"));
                            this.engineRef.RunManager.CurrentAction = react.Action;
                            bool reactionResult = await reactionToExecute.CompleteAsync(this.engineRef, new WorkflowEngineTrace(this.engineRef.Tracer), token);
                        }
                    }
                }
            }
            this.Executed = true;
        }