Beispiel #1
0
        public void LogError(ServiceBusException serviceBusException)
        {

            using (EntityModelCommon contextCommon = new EntityModelCommon())
            {

                Fault fault = new Fault();
                fault.Entity = serviceBusException.Entity;
                fault.EntityId = serviceBusException.EntityId;
                fault.ErrorMessage = serviceBusException.ErrorMessage;
                fault.ErrorDetails = serviceBusException.ErrorDetails;
                fault.ErrorDate = serviceBusException.ErrorDate;
                fault.ErrorType = serviceBusException.ErrorType;

                contextCommon.Faults.Add(fault);
                contextCommon.SaveChanges();
            }

        }
        public HttpResponseMessage AdvanceProcess([Metadata("SequenceId", "Unique identifier of the processflow")]
                                        long sequenceId)
        {

            try
            {

                using (EntityModelCommon contextCommon = new EntityModelCommon())
                {
                    ProcessFlow currentStep = (from PF in contextCommon.ProcessFlows
                                               where PF.SequenceId == sequenceId
                                               select PF).FirstOrDefault();

                    if (currentStep != null)
                    {

                        if (currentStep.IsLastStep == false)
                        {

                            ProcessFlow nextStep = (from PF in contextCommon.ProcessFlows
                                                    where PF.EntityId == currentStep.EntityId && PF.ProcessId == currentStep.ProcessId && PF.Sequence == currentStep.Sequence + 1
                                                    select PF).FirstOrDefault();

                            if (nextStep != null)
                            {
                                contextCommon.ProcessFlows.Attach(nextStep);
                                nextStep.Status = "Pending";
                            }
                            else
                            {
                                throw new ApplicationException("Process step is indicated not to be the last step, but the next step is not found. Check the process definition in the database.");
                            }

                        }

                        contextCommon.ProcessFlows.Attach(currentStep);
                        currentStep.Status = "Completed";
                        currentStep.EndDate = DateTime.Now;
                        contextCommon.SaveChanges();

                    }
                    else
                    {
                        throw new ApplicationException("Process step is not found based on the supplied ProcessFlowId.");
                    }

                }

                response = new HttpResponseMessage();
                response.StatusCode = HttpStatusCode.Accepted;
                return response;

            }
            catch (Exception ex)
            {

                string error = "Exception occurred when advancing the process.";
                ServiceBusException serviceBusException = new ServiceBusException("ProcessManager", "ProcessFlow", sequenceId.ToString(), error, ex.Message);
                ErrorHandler handler = new ErrorHandler();
                handler.LogError(serviceBusException);
                serviceBusException = null;
                handler = null;

                response = new HttpResponseMessage();
                response.StatusCode = HttpStatusCode.InternalServerError;
                string errorMsg = ex.Message.Replace("\r\n", string.Empty);
                errorMsg = errorMsg.Replace("\n", string.Empty);
                response.ReasonPhrase = errorMsg;
                return response;

            }

        }
        public HttpResponseMessage TriggerProcessStep(string triggerState, [Metadata("ProcessStep", "Name of the process step")] string processStep)
        {

            try
            {

                ProcessStepTrigger trigger;

                using (EntityModelCommon contextCommon = new EntityModelCommon())
                {

                    trigger = (from PF in contextCommon.ProcessFlows
                               join PS in contextCommon.ProcessSteps
                               on PF.StepId equals PS.StepId
                               where PF.Status == "Pending" && PS.Name == processStep && PF.StartDate == null
                               orderby PF.SequenceId ascending
                               select new ProcessStepTrigger { ProcessFlowId = PF.SequenceId, EntityId = PF.EntityId }).FirstOrDefault();

                    // Add startdate to the processstep
                    // Set polling action of trigger
                    if (trigger != null)
                    {

                        ProcessFlow currentStep = (from PF in contextCommon.ProcessFlows
                                                   where PF.SequenceId == trigger.ProcessFlowId
                                                   select PF).FirstOrDefault();

                        if (currentStep != null)
                        {
                            contextCommon.ProcessFlows.Attach(currentStep);
                            currentStep.StartDate = DateTime.Now;
                            contextCommon.SaveChanges();
                        }
                        else
                        {
                            throw new ApplicationException("Cannot set the startdate of the process step. Process step is not found based on the supplied ProcessFlowId.");
                        }

                        //If data -> Call EventTriggered -> triggerState = "ProcessStep is kicked off"
                        triggerState = "ProcessStep is kicked off";
                        return Request.EventTriggered(trigger, triggerState: triggerState, pollAgain: new TimeSpan(0, 1, 0));
                    }
                    else
                    {
                        //If no data -> Call EventWaitPoll -> triggerState = "ProcessStep is not kicked off"
                        triggerState = "ProcessStep is not kicked off";
                        return Request.EventWaitPoll(retryDelay: new TimeSpan(0, 1, 0), triggerState: triggerState);
                    }

                }
            }
            catch (Exception ex)
            {

                string error = String.Format("Exception occurred when triggering process step {0}", processStep);
                ServiceBusException serviceBusException = new ServiceBusException("ProcessManager", "ProcessFlow", "", error, ex.Message);
                ErrorHandler handler = new ErrorHandler();
                handler.LogError(serviceBusException);
                serviceBusException = null;
                handler = null;

                response = new HttpResponseMessage();
                response.StatusCode = HttpStatusCode.InternalServerError;
                string errorMsg = ex.Message.Replace("\r\n", string.Empty);
                errorMsg = errorMsg.Replace("\n", string.Empty);
                response.ReasonPhrase = errorMsg;
                return response;

            }

        }