public bool ExecuteNextStep(string executionId)
        {
            var nextRecipeStep = _recipeStepQueue.Dequeue(executionId);

            if (nextRecipeStep == null)
            {
                _recipeJournal.ExecutionComplete(executionId);
                _recipeExecuteEventHandler.ExecutionComplete(executionId);
                return(false);
            }
            _recipeJournal.WriteJournalEntry(executionId, string.Format("Executing step {0}.", nextRecipeStep.Name));
            var recipeContext = new RecipeContext {
                RecipeStep = nextRecipeStep, Executed = false, ExecutionId = executionId
            };

            try {
                _recipeExecuteEventHandler.RecipeStepExecuting(executionId, recipeContext);
                foreach (var recipeHandler in _recipeHandlers)
                {
                    recipeHandler.ExecuteRecipeStep(recipeContext);
                }
                _recipeExecuteEventHandler.RecipeStepExecuted(executionId, recipeContext);
            }
            catch (Exception exception) {
                Logger.Error(exception, "Recipe execution {0} was cancelled because a step failed to execute", executionId);
                while (_recipeStepQueue.Dequeue(executionId) != null)
                {
                    ;
                }
                _recipeJournal.ExecutionFailed(executionId);
                var message = T("Recipe execution with id {0} was cancelled because the \"{1}\" step failed to execute. The following exception was thrown: {2}. Refer to the error logs for more information.",
                                executionId, nextRecipeStep.Name, exception.Message);
                _recipeJournal.WriteJournalEntry(executionId, message.ToString());

                throw new OrchardCoreException(message);
            }

            if (!recipeContext.Executed)
            {
                Logger.Error("Could not execute recipe step '{0}' because the recipe handler was not found.", recipeContext.RecipeStep.Name);
                while (_recipeStepQueue.Dequeue(executionId) != null)
                {
                    ;
                }
                _recipeJournal.ExecutionFailed(executionId);
                var message = T("Recipe execution with id {0} was cancelled because the recipe handler for step \"{1}\" was not found. Refer to the error logs for more information.",
                                executionId, nextRecipeStep.Name);
                _recipeJournal.WriteJournalEntry(executionId, message.ToString());

                throw new OrchardCoreException(message);
            }

            return(true);
        }
예제 #2
0
        public bool ExecuteNextStep(string executionId)
        {
            var nextRecipeStep = _recipeStepQueue.Dequeue(executionId);

            if (nextRecipeStep == null)
            {
                Logger.Information("No more recipe steps left to execute.");
                _recipeExecuteEventHandler.ExecutionComplete(executionId);
                return(false);
            }

            Logger.Information("Executing recipe step '{0}'.", nextRecipeStep.Name);

            var recipeContext = new RecipeContext {
                RecipeStep = nextRecipeStep, Executed = false, ExecutionId = executionId
            };

            try {
                _recipeExecuteEventHandler.RecipeStepExecuting(executionId, recipeContext);

                foreach (var recipeHandler in _recipeHandlers)
                {
                    recipeHandler.ExecuteRecipeStep(recipeContext);
                }

                UpdateStepResultRecord(executionId, nextRecipeStep.RecipeName, nextRecipeStep.Id, nextRecipeStep.Name, isSuccessful: true);
                _recipeExecuteEventHandler.RecipeStepExecuted(executionId, recipeContext);
            }
            catch (Exception ex) {
                UpdateStepResultRecord(executionId, nextRecipeStep.RecipeName, nextRecipeStep.Id, nextRecipeStep.Name, isSuccessful: false, errorMessage: ex.Message);
                Logger.Error(ex, "Recipe execution failed because the step '{0}' failed.", nextRecipeStep.Name);
                while (_recipeStepQueue.Dequeue(executionId) != null)
                {
                    ;
                }
                var message = T("Recipe execution with ID {0} failed because the step '{1}' failed to execute. The following exception was thrown:\n{2}\nRefer to the error logs for more information.", executionId, nextRecipeStep.Name, ex.Message);
                throw new OrchardCoreException(message);
            }

            if (!recipeContext.Executed)
            {
                Logger.Error("Recipe execution failed because no matching handler for recipe step '{0}' was found.", recipeContext.RecipeStep.Name);
                while (_recipeStepQueue.Dequeue(executionId) != null)
                {
                    ;
                }
                var message = T("Recipe execution with ID {0} failed because no matching handler for recipe step '{1}' was found. Refer to the error logs for more information.", executionId, nextRecipeStep.Name);
                throw new OrchardCoreException(message);
            }

            return(true);
        }