kaka的gravatar头像
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日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友