コード例 #1
0
        public static async Task ProcessPost <TStepId, TData>(SessionEndContext <TStepId, TData> context)
#endif
        {
            ITransactionStep <TStepId, TData>    currentStep = context.Session.StepEnumerator.CurrentStep;
            ITransactionSession <TStepId, TData> session     = context.Session;
            Stopwatch watch = new Stopwatch();

            try
            {
                watch.Start();
#if NET35 || NOASYNC
                currentStep.PostAction(session.StepEnumerator.Data, context.Session);
#else
                if (currentStep.PostAction != null)
                {
                    currentStep.PostAction(session.StepEnumerator.Data, context.Session);
                }
                else
                {
                    await currentStep.AsyncPostAction(session.StepEnumerator.Data, context.Session);
                }
#endif
                watch.Stop();

                if (session.ShouldLogStepExecution())
                {
                    session.TransactionContext
                    .Logger
                    .LogExecutionTime(
                        watch.Elapsed,
                        "Transaction '{0}': execution time for post step action for step '{1}' with id '{2}'.",
                        session.TransactionContext.Info.Name,
                        session.StepEnumerator.CurrentStepIndex,
                        currentStep.Id);
                }
            }
            catch (Exception e)
            {
                watch.Stop();
                string info = string.Format(
                    "Transaction '{0}': an error occurred during processing post step action for step '{1}' with id '{2}', execution time '{3}'.",
                    session.TransactionContext.Info.Name,
                    session.StepEnumerator.CurrentStepIndex,
                    currentStep.Id,
                    watch.Elapsed);
                session.TransactionContext.Logger.ErrorFormat(e, info);
#if NET35 || NOASYNC
                SessionEndOperation.EndSession(context.AddError(e));
#else
                await SessionEndOperation.EndSession(context.AddError(e));
#endif
            }
        }
コード例 #2
0
 public static void ProcessPost <TStepId, TData>(SessionEndContext <TStepId, TData> context)
コード例 #3
0
        public static async Task RunPost <TStepId, TData>(SessionEndContext <TStepId, TData> context)
#endif
        {
            while (true)
            {
                ITransactionStep <TStepId, TData> step = context.Session.StepEnumerator.CurrentStep;

                if (step == null)
                {
#if NET35 || NOASYNC
                    SessionEndOperation.EndSession(context);
#else
                    await SessionEndOperation.EndSession(context);
#endif
                    return;
                }

                ITransactionSession <TStepId, TData> session = context.Session;

                if (session.Recovered &&
                    step.Settings.NotRunOnRecovered())
                {
                    session.TransactionContext
                    .Logger
                    .DebugFormat(
                        "Transaction '{0}': ignoring the post step action for step '{1}' with id '{2}' as the step cannot be executed on a recovered transaction.",
                        session.TransactionContext.Info.Name,
                        session.StepEnumerator.CurrentStepIndex,
                        session.StepEnumerator.CurrentStep.Id);
                    session.StepEnumerator.MoveNext();
                    continue;
                }
#if NET35 || NOASYNC
                if (step.PostAction == null)
#else
                if (step.PostAction == null &&
                    step.AsyncPostAction == null)
#endif
                {
                    session.TransactionContext
                    .Logger
                    .DebugFormat(
                        "Transaction '{0}': no post step action for step '{1}' with id '{2}'.",
                        session.TransactionContext.Info.Name,
                        session.StepEnumerator.CurrentStepIndex,
                        session.StepEnumerator.CurrentStep.Id);
                    session.StepEnumerator.MoveNext();
                    continue;
                }

                IExecutor executor = step.PostActionExecutor != null
                                            ? step.PostActionExecutor
                                            : step.Settings.SameExecutorForAllActions()
                                                ? step.StepActionExecutor
                                                : null;

                if (executor != null &&
                    executor.ShouldRun)
                {
#if NET35 || NOASYNC
                    executor.Run(() =>
                    {
                        ProcessPostOperation.ProcessPost(context);

                        if (!session.Ended)
                        {
                            session.StepEnumerator.MoveNext();
                            RunPostOperation.RunPost(context);
                        }
                    });
#else
                    executor.Run(async() =>
                    {
                        await ProcessPostOperation.ProcessPost(context);

                        if (!session.Ended)
                        {
                            session.StepEnumerator.MoveNext();
                            await RunPostOperation.RunPost(context);
                        }
                    });
#endif
                    return;
                }
                else
                {
#if NET35 || NOASYNC
                    ProcessPostOperation.ProcessPost(context);
#else
                    await ProcessPostOperation.ProcessPost(context);
#endif
                    session.StepEnumerator.MoveNext();
                }
            }
        }