/// <summary> /// Invokes the workflow impl. /// </summary> /// <param name="workflowActivity">The workflow activity.</param> /// <param name="dataTransferObject">The data transfer object.</param> /// <param name="executionExtensions">The execution extensions.</param> /// <param name="instanceId">The instance id.</param> /// <param name="workspace">The workspace.</param> /// <param name="bookmarkName">Name of the bookmark.</param> /// <param name="isDebug">if set to <c>true</c> [is debug].</param> /// <param name="errors">The errors.</param> /// <returns></returns> private IDSFDataObject InvokeWorkflowImpl(Activity workflowActivity, IDSFDataObject dataTransferObject, IList<object> executionExtensions, Guid instanceId, IWorkspace workspace, string bookmarkName, bool isDebug, out ErrorResultTO errors) { Tracker.TrackEvent(TrackerEventGroup.Workflows, TrackerEventName.Executed, string.Format("RES-{0}", dataTransferObject.ResourceID)); if(AllErrors == null) { AllErrors = new ErrorResultTO(); } IExecutionToken exeToken = new ExecutionToken { IsUserCanceled = false }; ExecutionStatusCallbackDispatcher.Instance.Post(dataTransferObject.ExecutionCallbackID, ExecutionStatusCallbackMessageType.StartedCallback); WorkflowApplication wfApp = InitEntryPoint(workflowActivity, dataTransferObject, executionExtensions, instanceId, workspace, bookmarkName); errors = new ErrorResultTO(); if(wfApp != null) { // add termination token wfApp.Extensions.Add(exeToken); using(ManualResetEventSlim waitHandle = new ManualResetEventSlim(false)) { WorkflowApplicationRun run = new WorkflowApplicationRun(this, waitHandle, dataTransferObject, wfApp, workspace, executionExtensions, FetchParentInstanceId(dataTransferObject), isDebug, errors, exeToken); if(instanceId == Guid.Empty) { Interlocked.Increment(ref Balance); run.Run(); _runTime = DateTime.Now; waitHandle.Wait(); } else { Interlocked.Increment(ref Balance); try { if(!string.IsNullOrEmpty(bookmarkName)) { dataTransferObject.CurrentBookmarkName = bookmarkName; run.Resume(dataTransferObject); } else { run.Run(); _runTime = DateTime.Now; } waitHandle.Wait(); } catch(InstanceNotReadyException e1) { Interlocked.Decrement(ref Balance); ExecutionStatusCallbackDispatcher.Instance.Post(dataTransferObject.ExecutionCallbackID, ExecutionStatusCallbackMessageType.ErrorCallback); errors.AddError(e1.Message); AllErrors.AddError(e1.Message); return null; } catch(InstancePersistenceException e2) { Interlocked.Decrement(ref Balance); ExecutionStatusCallbackDispatcher.Instance.Post(dataTransferObject.ExecutionCallbackID, ExecutionStatusCallbackMessageType.ErrorCallback); errors.AddError(e2.Message); AllErrors.AddError(e2.Message); return run.DataTransferObject.Clone(); } catch(Exception ex) { Interlocked.Decrement(ref Balance); errors.AddError(ex.Message); AllErrors.AddError(ex.Message); ExecutionStatusCallbackDispatcher.Instance.Post(dataTransferObject.ExecutionCallbackID, ExecutionStatusCallbackMessageType.ErrorCallback); return run.DataTransferObject.Clone(); } } Interlocked.Decrement(ref Balance); dataTransferObject = run.DataTransferObject.Clone(); var wfappUtils = new WfApplicationUtils(); ErrorResultTO invokeErrors; if (dataTransferObject.IsDebugMode()) { wfappUtils.DispatchDebugState(dataTransferObject, StateType.End, AllErrors.HasErrors(), AllErrors.MakeDisplayReady(), out invokeErrors, _runTime, false, true); } //AllErrors.MergeErrors(invokeErrors); // avoid memory leak ;) run.Dispose(); } } else { errors.AddError("Internal System Error : Could not create workflow execution wrapper"); } return dataTransferObject; }
/// <summary> /// Invokes the workflow impl. /// </summary> /// <param name="workflowActivity">The workflow activity.</param> /// <param name="dataTransferObject">The data transfer object.</param> /// <param name="executionExtensions">The execution extensions.</param> /// <param name="instanceId">The instance id.</param> /// <param name="workspace">The workspace.</param> /// <param name="bookmarkName">Name of the bookmark.</param> /// <param name="isDebug">if set to <c>true</c> [is debug].</param> /// <param name="errors">The errors.</param> /// <returns></returns> private IDSFDataObject InvokeWorkflowImpl(Activity workflowActivity, IDSFDataObject dataTransferObject, IList <object> executionExtensions, Guid instanceId, IWorkspace workspace, string bookmarkName, bool isDebug, out ErrorResultTO errors) { Tracker.TrackEvent(TrackerEventGroup.Workflows, TrackerEventName.Executed, string.Format("RES-{0}", dataTransferObject.ResourceID)); if (AllErrors == null) { AllErrors = new ErrorResultTO(); } IExecutionToken exeToken = new ExecutionToken { IsUserCanceled = false }; ExecutionStatusCallbackDispatcher.Instance.Post(dataTransferObject.ExecutionCallbackID, ExecutionStatusCallbackMessageType.StartedCallback); WorkflowApplication wfApp = InitEntryPoint(workflowActivity, dataTransferObject, executionExtensions, instanceId, workspace, bookmarkName); errors = new ErrorResultTO(); if (wfApp != null) { // add termination token wfApp.Extensions.Add(exeToken); using (ManualResetEventSlim waitHandle = new ManualResetEventSlim(false)) { WorkflowApplicationRun run = new WorkflowApplicationRun(this, waitHandle, dataTransferObject, wfApp, workspace, executionExtensions, FetchParentInstanceId(dataTransferObject), isDebug, errors, exeToken); if (instanceId == Guid.Empty) { Interlocked.Increment(ref Balance); run.Run(); _runTime = DateTime.Now; waitHandle.Wait(); } else { Interlocked.Increment(ref Balance); try { if (!string.IsNullOrEmpty(bookmarkName)) { dataTransferObject.CurrentBookmarkName = bookmarkName; run.Resume(dataTransferObject); } else { run.Run(); _runTime = DateTime.Now; } waitHandle.Wait(); } catch (InstanceNotReadyException e1) { Interlocked.Decrement(ref Balance); ExecutionStatusCallbackDispatcher.Instance.Post(dataTransferObject.ExecutionCallbackID, ExecutionStatusCallbackMessageType.ErrorCallback); errors.AddError(e1.Message); AllErrors.AddError(e1.Message); return(null); } catch (InstancePersistenceException e2) { Interlocked.Decrement(ref Balance); ExecutionStatusCallbackDispatcher.Instance.Post(dataTransferObject.ExecutionCallbackID, ExecutionStatusCallbackMessageType.ErrorCallback); errors.AddError(e2.Message); AllErrors.AddError(e2.Message); return(run.DataTransferObject.Clone()); } catch (Exception ex) { Interlocked.Decrement(ref Balance); errors.AddError(ex.Message); AllErrors.AddError(ex.Message); ExecutionStatusCallbackDispatcher.Instance.Post(dataTransferObject.ExecutionCallbackID, ExecutionStatusCallbackMessageType.ErrorCallback); return(run.DataTransferObject.Clone()); } } Interlocked.Decrement(ref Balance); dataTransferObject = run.DataTransferObject.Clone(); var wfappUtils = new WfApplicationUtils(); if (dataTransferObject.IsDebugMode()) { ErrorResultTO invokeErrors; wfappUtils.DispatchDebugState(dataTransferObject, StateType.End, AllErrors.HasErrors(), AllErrors.MakeDisplayReady(), out invokeErrors, _runTime, false, true); } //AllErrors.MergeErrors(invokeErrors); // avoid memory leak ;) run.Dispose(); } } else { errors.AddError("Internal System Error : Could not create workflow execution wrapper"); } return(dataTransferObject); }