public override bool Run(IWorkflowCoreRuntime workflowCoreRuntime)
            {
                Activity contextActivityForId = workflowCoreRuntime.GetContextActivityForId(base.ContextId);
                ActivityExecutionStatusChangedEventArgs args = this.args as ActivityExecutionStatusChangedEventArgs;

                if (args != null)
                {
                    args.BaseExecutor = workflowCoreRuntime;
                    if (args.Activity == null)
                    {
                        args.BaseExecutor = null;
                        return(false);
                    }
                }
                Activity activityByName = contextActivityForId.GetActivityByName(this.activityQualifiedName);

                if (((activityByName == null) || (((activityByName.ExecutionStatus == ActivityExecutionStatus.Closed) || (activityByName.ExecutionStatus == ActivityExecutionStatus.Initialized)) && !this.synchronousInvoke)) || (activityByName.HasPrimaryClosed && !(this.eventListener is ActivityExecutionFilter)))
                {
                    return(false);
                }
                try
                {
                    using (workflowCoreRuntime.SetCurrentActivity(activityByName))
                    {
                        using (ActivityExecutionContext context = new ActivityExecutionContext(activityByName))
                        {
                            if (this.delegateValue != null)
                            {
                                this.delegateValue(context, this.args);
                            }
                            else
                            {
                                this.eventListener.OnEvent(context, this.args);
                            }
                        }
                    }
                }
                catch (Exception exception)
                {
                    if (activityByName != null)
                    {
                        WorkflowTrace.Runtime.TraceEvent(TraceEventType.Error, 1, "Subscription handler of Activity {0} threw {1}", new object[] { activityByName.QualifiedName, exception.ToString() });
                    }
                    else
                    {
                        WorkflowTrace.Runtime.TraceEvent(TraceEventType.Error, 1, "Subscription handler threw {0}", new object[] { exception.ToString() });
                    }
                    throw;
                }
                finally
                {
                    if (args != null)
                    {
                        args.BaseExecutor = null;
                    }
                }
                return(true);
            }
 public static void OnEvent(CompositeActivity activity, object sender, ActivityExecutionStatusChangedEventArgs e)
 {
     ActivityExecutionContext executionContext = sender as ActivityExecutionContext;
     e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, (IActivityEventListener<ActivityExecutionStatusChangedEventArgs>) activity);
     if (((activity.ExecutionStatus == ActivityExecutionStatus.Canceling) || (activity.ExecutionStatus == ActivityExecutionStatus.Faulting)) || ((activity.ExecutionStatus == ActivityExecutionStatus.Executing) && !TryScheduleNextChild(activity, executionContext)))
     {
         activity.RemoveProperty(ActiveChildQualifiedNameProperty);
         executionContext.CloseActivity();
     }
 }
        public static void OnEvent(CompositeActivity activity, object sender, ActivityExecutionStatusChangedEventArgs e)
        {
            ActivityExecutionContext executionContext = sender as ActivityExecutionContext;

            e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, (IActivityEventListener <ActivityExecutionStatusChangedEventArgs>)activity);
            if (((activity.ExecutionStatus == ActivityExecutionStatus.Canceling) || (activity.ExecutionStatus == ActivityExecutionStatus.Faulting)) || ((activity.ExecutionStatus == ActivityExecutionStatus.Executing) && !TryScheduleNextChild(activity, executionContext)))
            {
                activity.RemoveProperty(ActiveChildQualifiedNameProperty);
                executionContext.CloseActivity();
            }
        }
        public void OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
        {
            ActivityExecutionContext context = sender as ActivityExecutionContext;

            if (context.Activity.HasPrimaryClosed && (context.Activity.LockCountOnStatusChange == 1))
            {
                context.ReleaseLocks(false);
                context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
                context.Activity.ReleaseLockOnStatusChange(this);
            }
        }
Esempio n. 5
0
        void IActivityEventListener <ActivityExecutionStatusChangedEventArgs> .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
        {
            ActivityExecutionContext context = sender as ActivityExecutionContext;

            if (context == null)
            {
                throw new ArgumentException("sender");
            }
            if (context.Activity.HasPrimaryClosed && (context.Activity.LockCountOnStatusChange == 1))
            {
                Exception exception = (Exception)context.Activity.GetValue(ActivityExecutionContext.CurrentExceptionProperty);
                if (exception != null)
                {
                    if (GetTransactionOptions(context.Activity) != null)
                    {
                        context.RequestRevertToCheckpointState(new EventHandler <EventArgs>(this.OnRevertInstanceState), new StateRevertedEventArgs(exception), false, null);
                    }
                    else
                    {
                        context.ReleaseLocks(false);
                        context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
                        context.Activity.ReleaseLockOnStatusChange(this);
                    }
                }
                else
                {
                    try
                    {
                        context.ReleaseLocks(true);
                        context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
                        context.Activity.ReleaseLockOnStatusChange(this);
                        context.DisposeCheckpointState();
                    }
                    catch
                    {
                        context.Activity.RegisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
                        throw;
                    }
                }
            }
        }
Esempio n. 6
0
 void expenseApproval_Executing(object sender, ActivityExecutionStatusChangedEventArgs e)
 {
     Console.WriteLine("Workflow: waiting for approval");
 }
Esempio n. 7
0
        // When a child activity is closed, it's removed from the execution context,
        // and the execution proceed to the next iteration.
        private void OnChildClose(Object sender, ActivityExecutionStatusChangedEventArgs e)
        {
            if (e == null)
                throw new ArgumentNullException("OnChildClose parameter 'e' is null.");
            if (sender == null)
                throw new ArgumentNullException("OnChildClose parameter 'sender' is null.");

            ActivityExecutionContext context = sender as ActivityExecutionContext;

            if (context == null)
                throw new ArgumentException("OnChildClose parameter 'sender' is not ActivityExecutionContext.");

            ForEach foreachActivity = context.Activity as ForEach;

            if (foreachActivity == null)
                throw new ArgumentException("OnChildClose parameter 'sender' does not contain a 'ForEach' activity.");

            // Remove the event handler first.
            e.Activity.Closed -= this.OnChildClose;

            // Then remove the child activity from the execution context.
            context.ExecutionContextManager.CompleteExecutionContext(context.ExecutionContextManager.GetExecutionContext(e.Activity));

            // Move on to the next iteration.
            if (this.ExecutionStatus == ActivityExecutionStatus.Canceling)
            {
                context.CloseActivity();
            }
            else if (this.ExecutionStatus == ActivityExecutionStatus.Executing)
            {
                if (!ExecuteNext(context))
                    context.CloseActivity();
            }
        }
Esempio n. 8
0
        void IActivityEventListener <ActivityExecutionStatusChangedEventArgs> .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
        {
            ActivityExecutionContext context = sender as ActivityExecutionContext;

            if (context == null)
            {
                throw new ArgumentException("sender");
            }

            if (context.Activity.HasPrimaryClosed && context.Activity.LockCountOnStatusChange == 1)
            {
                // get exception
                Exception exception = (Exception)context.Activity.GetValue(ActivityExecutionContext.CurrentExceptionProperty);
                if (exception != null)
                {
                    WorkflowTransactionOptions transactionOptions = TransactedContextFilter.GetTransactionOptions(context.Activity);
                    if (transactionOptions != null)
                    {
                        // request revert to checkpoint state
                        context.RequestRevertToCheckpointState(this.OnRevertInstanceState, new StateRevertedEventArgs(exception), false, null);
                    }
                    else
                    {
                        // release locks
                        context.ReleaseLocks(false);
                        context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
                        context.Activity.ReleaseLockOnStatusChange(this);
                    }
                }
                else
                {
                    try
                    {
                        // 1st param is for transactional, means if the release lock on status change will try to persist the workflow instace
                        // if that fails, then locks will be reacquired, otherwise they will be released.
                        context.ReleaseLocks(true);
                        context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
                        context.Activity.ReleaseLockOnStatusChange(this);
                        context.DisposeCheckpointState();
                    }
                    catch
                    {
                        // re-subscribe
                        context.Activity.RegisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
                        throw;
                    }
                }
            }
        }
            public override bool Run(IWorkflowCoreRuntime workflowCoreRuntime)
            {
                // get context activity
                Activity contextActivity = workflowCoreRuntime.GetContextActivityForId(this.ContextId);

                // Work around for ActivityExecutionStatusChangedEventArgs
                ActivityExecutionStatusChangedEventArgs activityStatusChangeEventArgs = this.args as ActivityExecutionStatusChangedEventArgs;

                if (activityStatusChangeEventArgs != null)
                {
                    activityStatusChangeEventArgs.BaseExecutor = workflowCoreRuntime;
                    if (activityStatusChangeEventArgs.Activity == null)
                    {
                        // status change for an activity that has been deleted dynamically since.
                        activityStatusChangeEventArgs.BaseExecutor = null;
                        return(false);
                    }
                }

                // get activity, if null, or if activity has already closed or just initialized, or if primary has closed and
                // the target of the notification is not ActivityExecutionFilter, then
                Activity activity = contextActivity.GetActivityByName(this.activityQualifiedName);

                if (activity == null ||
                    ((activity.ExecutionStatus == ActivityExecutionStatus.Closed || activity.ExecutionStatus == ActivityExecutionStatus.Initialized) && !this.synchronousInvoke) ||
                    (activity.HasPrimaryClosed && !(this.eventListener is ActivityExecutionFilter))
                    )
                {
                    return(false);
                }

                // call the delegate
                try
                {
                    using (workflowCoreRuntime.SetCurrentActivity(activity))
                    {
                        using (ActivityExecutionContext activityExecutionContext = new ActivityExecutionContext(activity))
                        {
                            if (this.delegateValue != null)
                            {
                                this.delegateValue(activityExecutionContext, this.args);
                            }
                            else
                            {
                                this.eventListener.OnEvent(activityExecutionContext, this.args);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    if (activity != null)
                    {
                        System.Workflow.Runtime.WorkflowTrace.Runtime.TraceEvent(TraceEventType.Error, 1, "Subscription handler of Activity {0} threw {1}", activity.QualifiedName, e.ToString());
                    }
                    else
                    {
                        System.Workflow.Runtime.WorkflowTrace.Runtime.TraceEvent(TraceEventType.Error, 1, "Subscription handler threw {0}", e.ToString());
                    }
                    throw;
                }
                finally
                {
                    // Work around for activity status change Event Args
                    if (activityStatusChangeEventArgs != null)
                    {
                        activityStatusChangeEventArgs.BaseExecutor = null;
                    }
                }
                return(true);
            }