正确退出activity_Activiti终止当前运行的流程实例

本文介绍如何在Activiti中正确地终止一个正在运行的流程实例。通过业务key获取流程实例,再获取当前任务,利用结束节点id直接跳转到结束事件,实现流程的终止。涉及到的方法包括HistoricProcessInstanceQuery、TaskQuery、JumpTaskCmdService等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当启动一个流程实例且这个实例没有结束时,如何根据我们的业务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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值