kaka
2017-05-12 14:09:57
Activiti终止当前运行的流程实例
当启动一个流程实例且这个实例没有结束时,如何根据我们的业务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<ActivityImpl> 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<String,List<ActivityImpl>> processActivitiMap = new HashMap<>(); public List<ActivityImpl> getAllActivities(String dkey) { List<ActivityImpl> 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<Comment> { 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; } }
评论

laishaofe LV7
2022年1月12日
qq88341200 LV1
2021年11月19日
peiyunman
2021年10月11日
暂无贡献等级
MrYue66
2021年7月28日
暂无贡献等级
250979238 LV2
2021年6月24日
sun_ny_fu LV1
2021年6月17日
zdm_321 LV1
2021年6月9日
ehewhee LV6
2021年4月7日
335435768 LV2
2021年3月5日
mixiumissuuu LV1
2020年12月25日