当启动一个流程实例且这个实例没有结束时,如何根据我们的业务id终止这流程实例呢?且看如下:
首先根据业务key获取到对应的流程实例,然后根据流程实例的id获取正在运行的任务,然后根据任务id和结束节点(type为endEvent)直接终止流程实例/**
* 终止正在运行的流程实例
* @author:kaka
* @param dkey:流程定义key,businessKey:业务id
*/
public void stopRunProcessInstance( String dkey,String businessKey) {
if( null != businessKey ) {
HistoricProcessInstance processInstanceId = workflowFactory.getHistoryService().createHistoricProcessInstanceQuery().processInstanceBusinessKey( businessKey ).singleResult();
Task task = workflowFactory.getTaskService().createTaskQuery().processInstanceId( processInstanceId.getId() ).singleResult();
if(null != task){
TaskServiceImpl taskServiceImpl = ( TaskServiceImpl )workflowFactory.getTaskService();
// 直接跳转到结束
String eventActivityId = workflowUtils.getEndEventActivityId(dkey);
taskServiceImpl.getCommandExecutor().execute( new JumpTaskCmdService( task.getExecutionId(), eventActivityId) );
}
}
}
workflowUtils.getEndEventActivityId(dkey)是我自己封装的一个获取结束节点activitiId的方法public String getEndEventActivityId(String dkey){
String endActivityId = null;
List allActivities = getAllActivities(dkey);
for(ActivityImpl activity : allActivities){
String type = activity.getProperty("type").toString();
if(type.equals("endEvent")){
endActivityId = activity.getId();
break;
}
}
return endActivityId;
}
//存放流程对应的所有activity
private static Map> processActivitiMap = new HashMap<>();
public List getAllActivities(String dkey) {
List activities = processActivitiMap.get(dkey);
if(activities == null){
RepositoryService repositoryService = factory.getRepositoryService();
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().processDefinitionKey(dkey).singleResult();
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(definition.getId());
//获取所有的activity
activities = processDefinition.getActivities();
processActivitiMap.put(dkey,activities);
}
return activities;
}
流程跳转的服务类package com.suninfo.workflow;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl;
import org.activiti.engine.task.Comment;
import org.springframework.stereotype.Service;
@Service("JumpTaskCmd")
public class JumpTaskCmdService implements Command {
protected String executionId; //当前任务的executionID
protected String activityId; //跳转目标activityID
public JumpTaskCmdService() {
}
public JumpTaskCmdService(String executionId, String activityId) {
this.executionId = executionId;
this.activityId = activityId;
}
public Comment execute(CommandContext commandContext) {
for (TaskEntity taskEntity : Context.getCommandContext().getTaskEntityManager().findTasksByExecutionId(executionId)) {
Context.getCommandContext().getTaskEntityManager().deleteTask(taskEntity, "jump", false);
}
ExecutionEntity executionEntity = Context.getCommandContext().getExecutionEntityManager().findExecutionById(executionId);
ProcessDefinitionImpl processDefinition = executionEntity.getProcessDefinition();
ActivityImpl activity = processDefinition.findActivity(activityId);
executionEntity.executeActivity(activity);
return null;
}
}