/// <summary> /// 节点内部业务逻辑执行 /// </summary> internal override void ExecuteWorkItem() { //执行前Action列表 OnBeforeExecuteWorkItem(); //设置流程完成 ProcessInstanceManager pim = new ProcessInstanceManager(); var processInstance = pim.Complete(ActivityForwardContext.ProcessInstance.ID, ActivityForwardContext.ActivityResource.AppRunner, Session); //如果当前流程是子流程,则子流程完成,主流程流转到下一节点 if (pim.IsSubProcess(processInstance) == true) { ContinueMainProcessRunning(processInstance, this.Session); } //执行后Action列表 OnAfterExecuteWorkItem(); //调用流程结束事件 DelegateExecutor.InvokeExternalDelegate(Session, EventFireTypeEnum.OnProcessCompleted, ActivityForwardContext.ActivityResource.AppRunner.DelegateEventList, ActivityForwardContext.ProcessInstance.ID); }
internal DelegateExecuteContext(DelegateExecutor executor, Func<object> delagateWapper, IEnumerable<DelegateArgument> arguments) : this(executor, delagateWapper) { Check.MustNotNull("arguments", "arguments"); _arguments = arguments.ToList(); }
internal DelegateExecuteContext(DelegateExecutor executor, Func<object> delagateWapper) { Check.MustNotNull("executor", "executor"); Check.MustNotNull("delagateWapper", "delagateWapper"); _executor = executor; _delagateWapper = delagateWapper; }
/// <summary> /// 执行流程完成事件 /// </summary> /// <param name="session">会话</param> private void OnProcessRunning(IDbSession session) { //调用流程结束事件 DelegateExecutor.InvokeExternalDelegate(session, EventFireTypeEnum.OnProcessRunning, base.ActivityResource.AppRunner.DelegateEventList, RunningActivityInstance.ProcessInstanceID); }
public async Task Delegates() { var called = 0; var executor = new DelegateExecutor(async(_, __) => called++); await executor.ExecuteAsync(null, null); Assert.Equal(1, called); }
/// <summary> /// 触发后执行 /// </summary> protected void OnAfterExecuteWorkItem() { var delegateService = GetDelegateService(); var actionList = this.EventActivity.ActionList; ActionExecutor.ExecteActionListAfter(actionList, delegateService as IDelegateService); //----> 节点流转完成后,调用活动完成执行的委托事件 DelegateExecutor.InvokeExternalDelegate(this.Session, EventFireTypeEnum.OnActivityExecuted, this.EventActivity, ActivityForwardContext); }
/// <summary> /// 执行流程完成事件 /// </summary> /// <param name="session">会话</param> private void OnProcessCompleted(IDbSession session) { var pim = new ProcessInstanceManager(); var entity = pim.GetById(session.Connection, RunningActivityInstance.ProcessInstanceID, session.Transaction); if (entity.ProcessState == (short)ProcessStateEnum.Completed) { //调用流程结束事件 DelegateExecutor.InvokeExternalDelegate(session, EventFireTypeEnum.OnProcessCompleted, base.ActivityResource.AppRunner.DelegateEventList, RunningActivityInstance.ProcessInstanceID); } }
/// <summary> /// 运行执行方法 /// </summary> /// <param name="session">会话</param> internal override void ExecuteInstanceImp(IDbSession session) { var result = base.WfExecutedResult; result.ProcessInstanceIDStarted = RunningActivityInstance.ProcessInstanceID; try { //创建运行时上下文 var runningExecutionContext = ActivityForwardContext.CreateRunningContext(base.TaskView, base.ProcessModel, base.ActivityResource, false, session); //----> 节点开始流转,调用活动开始执行的委托事件 DelegateExecutor.InvokeExternalDelegate(session, EventFireTypeEnum.OnActivityExecuting, runningExecutionContext); //执行节点流转过程 NodeMediator mediator = NodeMediatorFactory.CreateNodeMediator(runningExecutionContext, session); mediator.Linker.FromActivityInstance = RunningActivityInstance; mediator.ExecuteWorkItem(); //----> 节点流转完成后,调用活动完成执行的委托事件 DelegateExecutor.InvokeExternalDelegate(session, EventFireTypeEnum.OnActivityExecuted, runningExecutionContext); //构造回调函数需要的数据 result.Status = WfExecutedStatus.Success; result.Message = mediator.GetNodeMediatedMessage(); } catch (WfRuntimeException rx) { result.Status = WfExecutedStatus.Failed; result.ExceptionType = WfExceptionType.RunApp_RuntimeError; result.Message = rx.Message; throw rx; } catch (System.Exception ex) { result.Status = WfExecutedStatus.Failed; result.ExceptionType = WfExceptionType.RunApp_RuntimeError; result.Message = ex.Message; throw ex; } }
/// <summary> /// 触发后执行 /// </summary> protected void OnAfterExecuteWorkItem() { var delegateService = GetDelegateService(); var actionList = (this is NodeMediatorEnd) ? Linker.ToActivity.ActionList : Linker.FromActivity.ActionList; ActionExecutor.ExecteActionListAfter(actionList, delegateService as IDelegateService); //----> 节点流转完成后,调用活动完成执行的委托事件 var currentActivity = Linker.ToActivity != null ? Linker.ToActivity : Linker.FromActivity; DelegateExecutor.InvokeExternalDelegate(this.Session, EventFireTypeEnum.OnActivityExecuted, currentActivity, ActivityForwardContext); }
/// <summary> /// 触发前执行 /// </summary> protected void OnBeforeExecuteWorkItem() { var delegateService = GetDelegateService(); var actionList = Linker.FromActivity.ActionList; ActionExecutor.ExecteActionListBefore(actionList, delegateService as IDelegateService); //----> 节点流转前,调用活动执行的委托事件 var currentActivity = Linker.ToActivity != null ? Linker.ToActivity : Linker.FromActivity; DelegateExecutor.InvokeExternalDelegate(this.Session, EventFireTypeEnum.OnActivityExecuting, currentActivity, ActivityForwardContext); }
public async Task KeepsParameters() { var expectedMessage = new Message(); var expectedHandlers = new MessageHandler[] { msg => Task.CompletedTask }; object actualMessage = null; IReadOnlyCollection <MessageHandler> actualHandlers = null; var executor = new DelegateExecutor(async(msg, h) => { actualMessage = msg; actualHandlers = h; }); await executor.ExecuteAsync(expectedMessage, expectedHandlers); Assert.Same(expectedMessage, actualMessage); Assert.Same(expectedHandlers, actualHandlers); }
/// <summary> /// 创建活动任务转移实例数据 /// </summary> /// <param name="toActivity">活动</param> /// <param name="processInstance">流程实例</param> /// <param name="fromActivityInstance">开始活动实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="activityResource">活动资源</param> /// <param name="session">会话</param> internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { int newActivityInstanceID = 0; Boolean isParallel = false; if (fromActivityInstance.ActivityType == (short)ActivityTypeEnum.GatewayNode) { //并发多实例分支判断(AndSplit Multiple) var processModel = ProcessModelFactory.Create(processInstance.ProcessGUID, processInstance.Version); var activityNode = processModel.GetActivity(fromActivityInstance.ActivityGUID); isParallel = processModel.IsAndSplitMI(activityNode); } if (isParallel) { //并行多实例容器 var entity = new ActivityInstanceEntity(); var plist = activityResource.NextActivityPerformers[toActivity.ActivityGUID]; //创建并行多实例分支 for (var i = 0; i < plist.Count; i++) { entity = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); entity.AssignedToUserIDs = plist[i].UserID; entity.AssignedToUserNames = plist[i].UserName; entity.ActivityState = (short)ActivityStateEnum.Ready; //插入活动实例数据 entity.ID = base.ActivityInstanceManager.Insert(entity, session); //插入任务 base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, entity, transitionType, flyingType, activityResource.AppRunner, session); } } else { //普通任务节点 var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //进入运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance = GenerateActivityAssignedUserInfo(toActivityInstance, activityResource); //插入活动实例数据 newActivityInstanceID = base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); //调用外部事件的注册方法 var delegateContext = new DelegateContext { AppInstanceID = processInstance.AppInstanceID, ProcessGUID = processInstance.ProcessGUID, ProcessInstanceID = processInstance.ID, ActivityGUID = toActivity.ActivityGUID, ActivityCode = toActivity.ActivityCode, ActivityResource = activityResource }; DelegateExecutor.InvokeExternalDelegate(session, EventFireTypeEnum.OnActivityCreated, activityResource.AppRunner.DelegateEventList, delegateContext); } }