Skip to content

经过前面几章的学习,我们已经可以实现Activiti的基本操作,但是现在Activiti并没有实际的作用,现在已知的使用方式很难将其耦合在我们的项目中,本文将介绍如何使Activiti在项目中使用。

新建任务并指定业务id

Activiti流程可简化为“填写流程单→多层审批→结果”,其中填写流程单的信息回存储在我们自己定义的业务表中,我们将业务表中的id作为Activiti的主键,这样Activiti才不是自己玩自己的,可以和系统中的业务进行整合使用。当然,在使用的前提是需要部署,参考上文“流程部署”部分。

java
public void startProcess() {
    // 获取引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 启动实例,后一个参数就是业务参数
    ProcessInstance instance = runtimeService.startProcessInstanceByKey("holiday", "1001");
    System.out.println(instance.getBusinessKey());
}

根据业务id查询任务

根据业务id和业务key查询流程是系统中很常见的操作,本质上和使用面向对象思想拼接SQL有异曲同工之处,和上文中查询业务相同

java
public void testFindProcessInstance() {
    String processKey = "holiday";
    String businessId = "1001";
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    List<Task> taskList = taskService.createTaskQuery()
        .processDefinitionKey(processKey)
        .processInstanceBusinessKey(businessId).list();
    for (Task task : taskList) {
        System.out.println("流程定义id:" + task.getProcessDefinitionId());
        System.out.println("任务id:" + task.getId());
        System.out.println("当前审批人:" + task.getAssignee());
        System.out.println("任务进度名称:" + task.getName());
        System.out.println("<----------------------->");
    }
}

任务的挂起与激活

某些情况可能由于流程变更需要将当前运行的流程暂停而不是直接删除,流程暂停后将不会继续执行,也就是挂起的任务不会进行审批。

实例全部任务流程挂起

操作流程定义为挂起状态,该流程定义下边所有的流程实例全部暂停:流程定义为挂起状态该流程定义将不允许启动新的流程实例,同时该流程定义下所有的流程实例将全部挂起暂停执行。

java
public void SuspendAllProcessInstance() {
    // 1.获取引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    // 2.查询流程定义的对象
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("holiday").singleResult();
    // 3.得到当前流程定义的实例是否都为暂停状态
    boolean suspended = processDefinition.isSuspended();
    // 4.获取流程id
    String processId = processDefinition.getId();
    if (suspended) {
        // 5.如果是暂停,可以执行激活操作 ,参数1 :流程定义id ,参数2:是否激活,参数3:激活时间
        repositoryService.activateProcessDefinitionById(processId, true, null);
        System.out.println("processDefinitionId:" + processId + ",activate");
    } else {
        // 6.如果是激活状态,可以暂停,参数1 :流程定义id ,参数2:是否暂停,参数3:暂停时间
        repositoryService.suspendProcessDefinitionById(processId, true, null);
        System.out.println("processDefinitionId:" + processId + ",suspend");
    }
}

单个流程实例挂起与激活

先查询单个实例的ProcessInstanceId,然后根据这个id找到唯一的记录

java
public void testFindProcessInstance() {
    String processKey = "holiday";
    String businessId = "1001";
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processKey).processInstanceBusinessKey(businessId).list();
    System.out.println(task.get(0).getProcessInstanceId());
}

runtimeService.activateProcessInstanceById可以根据流程定义id实现单个流程实例的挂起与激活

java
public void SuspendOneProcessInstance() {
    // 1.获取引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 2.查询流程定义的对象
    ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId("27501").singleResult();
    // 3.查询流程是否为挂起状态
    boolean suspended = instance.isSuspended();
    // 4.流程定义id
    String processDefinitionId = instance.getId();
    // 5.判断是否为暂停
    if (suspended) {
        // 6.如果是暂停,可以执行激活操作 ,参数:流程定义id
        runtimeService.activateProcessInstanceById(processDefinitionId);
        System.out.println("processDefinitionId:" + processDefinitionId + ",activate");
    } else {
        // 7.如果是激活状态,可以暂停,参数:流程定义id
        runtimeService.suspendProcessInstanceById(processDefinitionId);
        System.out.println("processDefinitionId:" + processDefinitionId + ",suspend");
    }
}

测试:挂起后完成任务

挂起后测试

java
public void completeTask() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    // 如果只有一条任务,可以查询一条任务
    Task task = taskService.createTaskQuery().processDefinitionKey("holiday").singleResult();
    // 有多个的情况不可以使用singleResult
    // List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("holiday").list();
    // 完成任务
    taskService.complete(task.getId());
}

挂起后尝试完成任务测试结果,提示:Cannot complete a suspended task(无法完成挂起的任务)

挂起后尝试完成任务测试结果