/// <summary> /// Executes the specified errors. /// </summary> /// <param name="errors">The errors.</param> /// <returns></returns> public override Guid Execute(out ErrorResultTO errors) { errors = new ErrorResultTO(); // WorkflowApplicationFactory wfFactor = new WorkflowApplicationFactory(); Guid result = GlobalConstants.NullDataListID; // Set Service Name DataObject.ServiceName = ServiceAction.ServiceName; // Set server ID, only if not set yet - original server; if(DataObject.ServerID == Guid.Empty) DataObject.ServerID = HostSecurityProvider.Instance.ServerID; // Set resource ID, only if not set yet - original resource; if(DataObject.ResourceID == Guid.Empty && ServiceAction != null && ServiceAction.Service != null) DataObject.ResourceID = ServiceAction.Service.ID; // Travis : Now set Data List DataObject.DataList = ServiceAction.DataListSpecification; // Set original instance ID, only if not set yet - original resource; if(DataObject.OriginalInstanceID == Guid.Empty) DataObject.OriginalInstanceID = DataObject.DataListID; Dev2Logger.Log.Info(String.Format("Started Execution for Service Name:{0} Resource Id:{1} Mode:{2}",DataObject.ServiceName,DataObject.ResourceID,DataObject.IsDebug?"Debug":"Execute")); //Set execution origin if(!string.IsNullOrWhiteSpace(DataObject.ParentServiceName)) { DataObject.ExecutionOrigin = ExecutionOrigin.Workflow; DataObject.ExecutionOriginDescription = DataObject.ParentServiceName; } else if(DataObject.IsDebug) { DataObject.ExecutionOrigin = ExecutionOrigin.Debug; } else { DataObject.ExecutionOrigin = ExecutionOrigin.External; } try { // BUG 9304 - 2013.05.08 - TWR - Added CompileExpressions //_workflowHelper.CompileExpressions(theActivity,DataObject.ResourceID); //IDSFDataObject exeResult = wfFactor.InvokeWorkflow(activity.Value, DataObject, // new List<object> { EsbChannel, }, instanceId, // TheWorkspace, bookmark, out errors); var wfappUtils = new WfApplicationUtils(); IExecutionToken exeToken = new ExecutionToken { IsUserCanceled = false }; DataObject.ExecutionToken = exeToken; ErrorResultTO invokeErrors; if (DataObject.IsDebugMode()) { wfappUtils.DispatchDebugState(DataObject, StateType.Start, DataObject.Environment.HasErrors(), DataObject.Environment.FetchErrors(), out invokeErrors, null, true); } Eval(DataObject.ResourceID, DataObject); if (DataObject.IsDebugMode()) { wfappUtils.DispatchDebugState(DataObject, StateType.End, DataObject.Environment.HasErrors(), DataObject.Environment.FetchErrors(), out invokeErrors, DateTime.Now, false, true); } result = DataObject.DataListID; } catch(InvalidWorkflowException iwe) { Dev2Logger.Log.Error(iwe); var msg = iwe.Message; int start = msg.IndexOf("Flowchart ", StringComparison.Ordinal); // trap the no start node error so we can replace it with something nicer ;) errors.AddError(start > 0 ? GlobalConstants.NoStartNodeError : iwe.Message); } catch(Exception ex) { Dev2Logger.Log.Error(ex); errors.AddError(ex.Message); } finally { //ServiceAction.PushActivity(activity); } Dev2Logger.Log.Info(String.Format("Completed Execution for Service Name:{0} Resource Id: {1} Mode:{2}",DataObject.ServiceName,DataObject.ResourceID,DataObject.IsDebug?"Debug":"Execute")); return result; }
/// <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; }
Guid ExecuteWf(ErrorResultTO to) { Guid result = new Guid(); try { // BUG 9304 - 2013.05.08 - TWR - Added CompileExpressions //_workflowHelper.CompileExpressions(theActivity,DataObject.ResourceID); //IDSFDataObject exeResult = wfFactor.InvokeWorkflow(activity.Value, DataObject, // new List<object> { EsbChannel, }, instanceId, // TheWorkspace, bookmark, out errors); var wfappUtils = new WfApplicationUtils(); IExecutionToken exeToken = new ExecutionToken { IsUserCanceled = false }; DataObject.ExecutionToken = exeToken; ErrorResultTO invokeErrors; if(DataObject.IsDebugMode()) { wfappUtils.DispatchDebugState(DataObject, StateType.Start, DataObject.Environment.HasErrors(), DataObject.Environment.FetchErrors(), out invokeErrors, DateTime.Now, true, false, false); } Eval(DataObject.ResourceID, DataObject); if(DataObject.IsDebugMode()) { wfappUtils.DispatchDebugState(DataObject, StateType.End, DataObject.Environment.HasErrors(), DataObject.Environment.FetchErrors(), out invokeErrors, DataObject.StartTime, false, true); } result = DataObject.DataListID; } catch(InvalidWorkflowException iwe) { Dev2Logger.Log.Error(iwe); var msg = iwe.Message; int start = msg.IndexOf("Flowchart ", StringComparison.Ordinal); // trap the no start node error so we can replace it with something nicer ;) to.AddError(start > 0 ? GlobalConstants.NoStartNodeError : iwe.Message); } catch(Exception ex) { Dev2Logger.Log.Error(ex); to.AddError(ex.Message); } return result; }