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); } }
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; } } } }
void expenseApproval_Executing(object sender, ActivityExecutionStatusChangedEventArgs e) { Console.WriteLine("Workflow: waiting for approval"); }
// 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(); } }
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); }