/// <summary> /// 响应任务实例的事件。通过e.getEventType区分事件的类型。 /// </summary> /// <param name="e">任务实例的事件。</param> public void onTaskInstanceEventFired(TaskInstanceEvent e)// throws EngineException { IWorkflowSession session = e.WorkflowSession; IProcessInstance proceInst = e.ProcessInstance; ITaskInstance taskInst = (ITaskInstance)e.Source; IWorkItem wi = e.WorkItem; switch (e.EventType) { case TaskInstanceEventEnum.BEFORE_TASK_INSTANCE_START: beforeTaskInstanceStart(session, proceInst, taskInst); break; case TaskInstanceEventEnum.AFTER_WORKITEM_CREATED: afterWorkItemCreated(session, proceInst, taskInst, wi); break; case TaskInstanceEventEnum.AFTER_WORKITEM_COMPLETE: afterWorkItemComplete(session, proceInst, taskInst, wi); break; case TaskInstanceEventEnum.AFTER_TASK_INSTANCE_COMPLETE: afterTaskInstanceCompleted(session, proceInst, taskInst); break; default: break; } }
/// <summary> /// 终止当前TaskInstance,检查是否可以中止当前ActivityInstance,如果可以, /// 则结束当前ActivityInstance,并触发targetActivityInstance或后继ActivityInstance /// </summary> /// <param name="currentSession"></param> /// <param name="processInstance"></param> /// <param name="taskInstance"></param> /// <param name="targetActivityInstance"></param> public void completeTaskInstance(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance, IActivityInstance targetActivityInstance) { //如果TaskInstance处于结束状态,则直接返回 if (taskInstance.State == TaskInstanceStateEnum.COMPLETED || taskInstance.State == TaskInstanceStateEnum.CANCELED) { return; } if (taskInstance.State == TaskInstanceStateEnum.INITIALIZED) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "Complete task insatance failed.The state of the task insatnce[id=" + taskInstance.Id + "] is " + taskInstance.State); } if (taskInstance.IsSuspended()) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "Complete task insatance failed. The task instance [id=" + taskInstance.Id + "] is suspended"); } if (targetActivityInstance != null) { ((TaskInstance)taskInstance).TargetActivityId=targetActivityInstance.Activity.Id; } IPersistenceService persistenceService = this.RuntimeContext.PersistenceService; //第一步,首先结束当前taskInstance if (!this.taskInstanceCanBeCompleted(currentSession, this.RuntimeContext, processInstance, taskInstance)) { return; } ((TaskInstance)taskInstance).State=TaskInstanceStateEnum.COMPLETED; ((TaskInstance)taskInstance).CanBeWithdrawn=false; ((TaskInstance)taskInstance).EndTime=RuntimeContext.CalendarService.getSysDate(); persistenceService.SaveOrUpdateTaskInstance(taskInstance); //触发相应的事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=taskInstance; e.WorkflowSession=currentSession; e.ProcessInstance=processInstance; e.EventType = TaskInstanceEventEnum.AFTER_TASK_INSTANCE_COMPLETE; if (this.DefaultTaskInstanceEventListener != null) { this.DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(taskInstance, e); //第二步,检查ActivityInstance是否可以结束 if (!activityInstanceCanBeCompleted(taskInstance)) { return; } //第三步,尝试结束对应的activityInstance List<IToken> tokens = persistenceService.FindTokensForProcessInstance(taskInstance.ProcessInstanceId, taskInstance.ActivityId); // System.out.println("Inside TaskInstance.complete(targetActivityInstance):: tokens.size is "+tokens.Count); if (tokens == null || tokens.Count == 0) { return;//表明activityInstance已经结束了。 } if (tokens.Count > 1) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "与activityId=" + taskInstance.ActivityId + "对应的token数量(=" + tokens.Count + ")不正确,正确只能为1,因此无法完成complete操作"); } IToken token = tokens[0]; //stepNumber不相等,不允许执行结束操作。 if (token.StepNumber != taskInstance.StepNumber) { return; } if (token.IsAlive == false) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "与activityId=" + taskInstance.ActivityId + "对应的token.alive=false,因此无法完成complete操作"); } INetInstance netInstance = this.RuntimeContext.KernelManager.getNetInstance(taskInstance.ProcessId, taskInstance.Version); Object obj = netInstance.getWFElementInstance(taskInstance.ActivityId); if (obj == null) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "系统没有找到与activityId=" + taskInstance.ActivityId + "对应activityInstance,无法执行complete操作。"); } token.ProcessInstance = processInstance; ((IActivityInstance)obj).complete(token, targetActivityInstance); }
public void completeWorkItem(IWorkItem workItem, IActivityInstance targetActivityInstance, String comments) { if (workItem.State != WorkItemEnum.RUNNING) { TaskInstance thisTaskInst = (TaskInstance)workItem.TaskInstance; // System.out.println("WorkItem的当前状态为"+this.State+",不可以执行complete操作。"); throw new EngineException(thisTaskInst.ProcessInstanceId, thisTaskInst.WorkflowProcess, thisTaskInst.TaskId, "Complete work item failed . The state of the work item [id=" + workItem.Id + "] is " + workItem.State); } if (workItem.TaskInstance.IsSuspended()) { TaskInstance thisTaskInst = (TaskInstance)workItem.TaskInstance; WorkflowProcess process = thisTaskInst.WorkflowProcess; throw new EngineException(thisTaskInst.ProcessInstanceId, process, thisTaskInst.TaskId, "Complete work item failed. The correspond task instance [id=" + thisTaskInst.Id + "] is suspended"); } IPersistenceService persistenceService = RuntimeContext.PersistenceService; ((WorkItem)workItem).Comments=comments; ((WorkItem)workItem).State = WorkItemEnum.COMPLETED; ((WorkItem)workItem).EndTime=RuntimeContext.CalendarService.getSysDate(); persistenceService.SaveOrUpdateWorkItem(workItem); // 触发AFTER_WORKITEM_COMPLETE事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=workItem.TaskInstance; e.WorkflowSession=((IWorkflowSessionAware)workItem).CurrentWorkflowSession; e.ProcessInstance=((TaskInstance)workItem.TaskInstance).AliveProcessInstance; e.EventType = TaskInstanceEventEnum.AFTER_WORKITEM_COMPLETE; if (this.DefaultTaskInstanceEventListener != null) { this.DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(workItem.TaskInstance, e); ((TaskInstance)workItem.TaskInstance).complete(targetActivityInstance); }
public void abortTaskInstanceEx(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance thisTaskInst, String targetActivityId) { // 如果TaskInstance处于结束状态,则直接返回 if (thisTaskInst.State == TaskInstanceStateEnum.COMPLETED || thisTaskInst.State == TaskInstanceStateEnum.CANCELED) { return; } // Initialized状态的TaskInstance也可以中止,20090830 // if (taskInstance.State == ITaskInstance.INITIALIZED) { // WorkflowProcess process = taskInstance.getWorkflowProcess(); // throw new EngineException(taskInstance.getProcessInstanceId(), // process, // taskInstance.getTaskId(), // "Complete task insatance failed.The state of the task insatnce[id=" + // taskInstance.getId() + "] is " + taskInstance.State); // } if (thisTaskInst.IsSuspended()) { WorkflowProcess process = thisTaskInst.WorkflowProcess; throw new EngineException(thisTaskInst.ProcessInstanceId, process, thisTaskInst.TaskId, "Abort task insatance failed. The task instance [id=" + thisTaskInst.Id + "] is suspended"); } // IPersistenceService persistenceService = this.RuntimeContext.PersistenceService; WorkflowProcess workflowProcess = thisTaskInst.WorkflowProcess; List<IToken> allTokens = null; List<String> aliveActivityIdsAfterJump = new List<String>(); if (targetActivityId != null) { String thisActivityId = thisTaskInst.ActivityId; Boolean isInSameLine = workflowProcess.isInSameLine(thisActivityId, targetActivityId); if (isInSameLine) { this.abortTaskInstance(currentSession, processInstance, thisTaskInst, targetActivityId); } //合法性检查 allTokens = persistenceService.FindTokensForProcessInstance(thisTaskInst.ProcessInstanceId, null); aliveActivityIdsAfterJump.Add(targetActivityId); for (int i = 0; allTokens != null && i < allTokens.Count; i++) { IToken tokenTmp = allTokens[i]; IWFElement workflowElement = workflowProcess.findWFElementById(tokenTmp.NodeId); if ((workflowElement is Activity) && !workflowElement.Id.Equals(thisActivityId)) { aliveActivityIdsAfterJump.Add(workflowElement.Id); if (workflowProcess.isReachable(targetActivityId, workflowElement.Id) || workflowProcess.isReachable(workflowElement.Id, targetActivityId)) { throw new EngineException( thisTaskInst.ProcessInstanceId, thisTaskInst.WorkflowProcess, thisTaskInst.TaskId, "Abort refused because of the business-logic conflict!"); } } } //1)检查是否在同一个“执行线”上(不做该检查,20091008) // if (!isInSameLine) { // throw new EngineException( // taskInstance.getProcessInstanceId(), // taskInstance.getWorkflowProcess(), // taskInstance.getTaskId(), // "Jumpto refused because of the current activitgy and the target activity are NOT in the same 'Execution Thread'."); // } } INetInstance netInstance = this.RuntimeContext.KernelManager.getNetInstance(workflowProcess.Id, thisTaskInst.Version); IActivityInstance targetActivityInstance = null; if (targetActivityId != null) { targetActivityInstance = (IActivityInstance)netInstance.getWFElementInstance(targetActivityId); } IActivityInstance thisActivityInstance = (IActivityInstance)netInstance.getWFElementInstance(thisTaskInst.ActivityId); if (thisActivityInstance == null) { WorkflowProcess process = thisTaskInst.WorkflowProcess; throw new EngineException(thisTaskInst.ProcessInstanceId, process, thisTaskInst.TaskId, "系统没有找到与activityId=" + thisTaskInst.ActivityId + "对应activityInstance,无法执行abort操作。"); } if (targetActivityInstance != null) { ((TaskInstance)thisTaskInst).TargetActivityId=targetActivityInstance.Activity.Id; } // 第一步,首先Abort当前taskInstance persistenceService.AbortTaskInstance((TaskInstance)thisTaskInst); // 触发相应的事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=thisTaskInst; e.WorkflowSession=currentSession; e.ProcessInstance=processInstance; e.EventType = TaskInstanceEventEnum.AFTER_TASK_INSTANCE_COMPLETE; if (this.DefaultTaskInstanceEventListener != null) { this.DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(thisTaskInst, e); // 第二步,检查ActivityInstance是否可以结束 if (!activityInstanceCanBeCompleted(thisTaskInst)) { return; } // 第三步,尝试结束对应的activityInstance List<IToken> tokens = persistenceService.FindTokensForProcessInstance(thisTaskInst.ProcessInstanceId, thisTaskInst.ActivityId); // System.out.println("Inside TaskInstance.complete(targetActivityInstance):: tokens.size is "+tokens.size()); if (tokens == null || tokens.Count == 0) { return;// 表明activityInstance已经结束了。 } if (tokens.Count > 1) { WorkflowProcess process = thisTaskInst.WorkflowProcess; throw new EngineException(thisTaskInst.ProcessInstanceId, process, thisTaskInst.TaskId, "与activityId=" + thisTaskInst.ActivityId + "对应的token数量(=" + tokens.Count + ")不正确,正确只能为1,因此无法完成complete操作"); } IToken token = tokens[0]; // stepNumber不相等,不允许执行结束操作。 if (token.StepNumber != thisTaskInst.StepNumber) { return; } if (token.IsAlive == false) { WorkflowProcess process = thisTaskInst.WorkflowProcess; throw new EngineException(thisTaskInst.ProcessInstanceId, process, thisTaskInst.TaskId, "与activityId=" + thisTaskInst.ActivityId + "对应的token.alive=false,因此无法完成complete操作"); } token.ProcessInstance = processInstance; //调整token布局 if (targetActivityId != null) { List<Synchronizer> allSynchronizersAndEnds = new List<Synchronizer>(); allSynchronizersAndEnds.AddRange(workflowProcess.Synchronizers); allSynchronizersAndEnds.AddRange((IEnumerable<Synchronizer>)workflowProcess.EndNodes.ToArray()); //allSynchronizersAndEnds.AddRange((List<Synchronizer>)); for (int i = 0; i < allSynchronizersAndEnds.Count; i++) { Synchronizer synchronizer = allSynchronizersAndEnds[i]; if (synchronizer.Name.Equals("Synchronizer4")) { //System.out.println(synchronizer.Name); } int volumn = 0; if (synchronizer is EndNode) { volumn = synchronizer.EnteringTransitions.Count; } else { volumn = synchronizer.EnteringTransitions.Count * synchronizer.LeavingTransitions.Count; } IToken tokenTmp = new Token(); tokenTmp.NodeId = synchronizer.Id; tokenTmp.IsAlive = false; tokenTmp.ProcessInstanceId = thisTaskInst.ProcessInstanceId; tokenTmp.StepNumber = -1; List<String> incomingTransitionIds = new List<String>(); Boolean reachable = false; List<Transition> enteringTrans = synchronizer.EnteringTransitions; for (int m = 0; m < aliveActivityIdsAfterJump.Count; m++) { String aliveActivityId = aliveActivityIdsAfterJump[m]; if (workflowProcess.isReachable(aliveActivityId, synchronizer.Id)) { Transition trans = null; reachable = true; for (int j = 0; j < enteringTrans.Count; j++) { trans = enteringTrans[j]; Node fromNode = (Node)trans.FromNode; if (workflowProcess.isReachable(aliveActivityId, fromNode.Id)) { if (!incomingTransitionIds.Contains(trans.Id)) { incomingTransitionIds.Add(trans.Id); } } } } } if (reachable) { tokenTmp.Value = volumn - (incomingTransitionIds.Count * volumn / enteringTrans.Count); IToken virtualToken = getJoinInfo(allTokens, synchronizer.Id); if (virtualToken != null) { persistenceService.DeleteTokensForNode(thisTaskInst.ProcessInstanceId, synchronizer.Id); } if (tokenTmp.Value != 0) { tokenTmp.ProcessInstance = processInstance; persistenceService.SaveOrUpdateToken(tokenTmp); } } } } thisActivityInstance.complete(token, targetActivityInstance); }
/// <summary> /// 触发task instance相关的事件 /// </summary> /// <param name="taskInstance"></param> /// <param name="e"></param> protected void fireTaskInstanceEvent(ITaskInstance taskInstance, TaskInstanceEvent e) { Task task = taskInstance.Task; if (task == null) { return; } List<EventListener> listeners = task.EventListeners; for (int i = 0; i < listeners.Count; i++) { EventListener listener = (EventListener)listeners[i]; Object obj = RuntimeContext.getBeanByName(listener.ClassName); if (obj != null && (obj is ITaskInstanceEventListener)) { ((ITaskInstanceEventListener)obj).onTaskInstanceEventFired(e); } } }
/// <summary> /// 启动TaskInstance。 /// 该方法定义为final,不允许子类扩展。 /// </summary> public void startTaskInstance(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance) { //触发事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=taskInstance; e.WorkflowSession=currentSession; e.ProcessInstance=processInstance; e.EventType = TaskInstanceEventEnum.BEFORE_TASK_INSTANCE_START; if (DefaultTaskInstanceEventListener != null) { DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(taskInstance, e); ((TaskInstance)taskInstance).State=TaskInstanceStateEnum.RUNNING; ((TaskInstance)taskInstance).StartedTime=this.RuntimeContext.CalendarService.getSysDate(); this.RuntimeContext.PersistenceService.SaveOrUpdateTaskInstance(taskInstance); Task task = taskInstance.Task; String taskInstanceRunnerName = null; ITaskInstanceRunner taskInstanceRunner = null; TaskTypeEnum taskType = task.TaskType; taskInstanceRunnerName = task.TaskInstanceRunner; if (!String.IsNullOrEmpty(taskInstanceRunnerName.Trim())) { IBeanFactory beanFactory = this.RuntimeContext.BeanFactory; taskInstanceRunner = (ITaskInstanceRunner)beanFactory.GetBean(taskInstanceRunnerName); } if (taskInstanceRunner == null) { if (TaskTypeEnum.FORM == taskType) { taskInstanceRunnerName = processInstance.WorkflowProcess.FormTaskInstanceRunner; } else if (TaskTypeEnum.TOOL == taskType) { taskInstanceRunnerName = processInstance.WorkflowProcess.ToolTaskInstanceRunner; } else if (TaskTypeEnum.SUBFLOW == taskType) { taskInstanceRunnerName = processInstance.WorkflowProcess.SubflowTaskInstanceRunner; } if (!String.IsNullOrEmpty(taskInstanceRunnerName.Trim())) { IBeanFactory beanFactory = this.RuntimeContext.BeanFactory; taskInstanceRunner = (ITaskInstanceRunner)beanFactory.GetBean(taskInstanceRunnerName); } } if (taskInstanceRunner == null) { if (TaskTypeEnum.FORM == taskType) { taskInstanceRunner = DefaultFormTaskInstanceRunner; } else if (TaskTypeEnum.TOOL == taskType) { taskInstanceRunner = DefaultToolTaskInstanceRunner; } else if (TaskTypeEnum.SUBFLOW == taskType) { taskInstanceRunner = DefaultSubflowTaskInstanceRunner; } } if (taskInstanceRunner != null) { taskInstanceRunner.run(currentSession, this.RuntimeContext, processInstance, taskInstance); } else { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "无法获取TaskInstanceRunner,TaskId=" + task.Id + ", taskType=" + taskInstance.TaskType); } }
public WorkItem createWorkItem(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance, String actorId) { IPersistenceService persistenceService = this.RuntimeContext.PersistenceService; WorkItem wi = new WorkItem(); wi.TaskInstance=taskInstance; wi.ActorId=actorId; wi.State=WorkItemEnum.INITIALIZED; wi.CreatedTime = this.RuntimeContext.CalendarService.getSysDate(); wi.RuntimeContext = this.RuntimeContext; wi.CurrentWorkflowSession=currentSession; //保存到数据库 persistenceService.SaveOrUpdateWorkItem(wi); //触发事件 //触发相应的事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=taskInstance; e.WorkItem=wi; e.WorkflowSession=currentSession; e.ProcessInstance=processInstance; e.EventType = TaskInstanceEventEnum.AFTER_WORKITEM_CREATED; if (this.DefaultTaskInstanceEventListener != null) { this.DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(taskInstance, e); return wi; }
/// <summary> /// 中止当前的TaskInstance,并使得流程流转到指定的环节。 /// </summary> /// <param name="currentSession"></param> /// <param name="processInstance"></param> /// <param name="taskInstance"></param> /// <param name="targetActivityId"></param> public void abortTaskInstance(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance, String targetActivityId) { // 如果TaskInstance处于结束状态,则直接返回 if (taskInstance.State == TaskInstanceStateEnum.COMPLETED || taskInstance.State == TaskInstanceStateEnum.CANCELED) { return; } // Initialized状态的TaskInstance也可以中止,20090830 // if (taskInstance.State == ITaskInstance.INITIALIZED) { // WorkflowProcess process = taskInstance.getWorkflowProcess(); // throw new EngineException(taskInstance.getProcessInstanceId(), // process, // taskInstance.getTaskId(), // "Complete task insatance failed.The state of the task insatnce[id=" + // taskInstance.getId() + "] is " + taskInstance.State); // } if (taskInstance.IsSuspended()) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "Abort task insatance failed. The task instance [id=" + taskInstance.Id + "] is suspended"); } // 1)检查是否在同一个“执行线”上 WorkflowProcess workflowProcess = taskInstance.WorkflowProcess; if (targetActivityId != null) { String thisActivityId = taskInstance.ActivityId; Boolean isInSameLine = workflowProcess.isInSameLine(thisActivityId, targetActivityId); if (!isInSameLine) { throw new EngineException( taskInstance.ProcessInstanceId, taskInstance.WorkflowProcess, taskInstance.TaskId, "Jumpto refused because of the current activitgy and the target activity are NOT in the same 'Execution Thread'."); } } INetInstance netInstance = this.RuntimeContext.KernelManager.getNetInstance(workflowProcess.Id, taskInstance.Version); IActivityInstance targetActivityInstance = (IActivityInstance)netInstance.getWFElementInstance(targetActivityId); IActivityInstance thisActivityInstance = (IActivityInstance)netInstance.getWFElementInstance(taskInstance.ActivityId); if (thisActivityInstance == null) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "系统没有找到与activityId=" + taskInstance.ActivityId + "对应activityInstance,无法执行abort操作。"); } if (targetActivityInstance != null) { ((TaskInstance)taskInstance).TargetActivityId=targetActivityInstance.Activity.Id; } IPersistenceService persistenceService = this.RuntimeContext.PersistenceService; // 第一步,首先Abort当前taskInstance persistenceService.AbortTaskInstance((TaskInstance)taskInstance); // 触发相应的事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=taskInstance; e.WorkflowSession=currentSession; e.ProcessInstance=processInstance; e.EventType = TaskInstanceEventEnum.AFTER_TASK_INSTANCE_COMPLETE; if (this.DefaultTaskInstanceEventListener != null) { this.DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(taskInstance, e); // 第二步,检查ActivityInstance是否可以结束 if (!activityInstanceCanBeCompleted(taskInstance)) { return; } // 第三步,尝试结束对应的activityInstance List<IToken> tokens = persistenceService.FindTokensForProcessInstance(taskInstance.ProcessInstanceId, taskInstance.ActivityId); // System.out.println("Inside TaskInstance.complete(targetActivityInstance):: tokens.size is "+tokens.size()); if (tokens == null || tokens.Count == 0) { return;// 表明activityInstance已经结束了。 } if (tokens.Count > 1) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "与activityId=" + taskInstance.ActivityId + "对应的token数量(=" + tokens.Count + ")不正确,正确只能为1,因此无法完成complete操作"); } IToken token = tokens[0]; // stepNumber不相等,不允许执行结束操作。 if (token.StepNumber != taskInstance.StepNumber) { return; } if (token.IsAlive == false) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "与activityId=" + taskInstance.ActivityId + "对应的token.alive=false,因此无法完成complete操作"); } token.ProcessInstance = processInstance; thisActivityInstance.complete(token, targetActivityInstance); }