11 API(6)启动流程-流程实例

 

 

1. 执行流

ProcessInstance继承了Execution,被称为主执行流,一定会有个主执行流

子执行流:流程有多少个流程分支就会有多少个子执行流

11 API(6)启动流程-流程实例_第1张图片

1.1 单个子流程案例

1.1.1 流程图

11 API(6)启动流程-流程实例_第2张图片

1.1.2 代码

package com.study.c11;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;

public class Single {

    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService.createDeployment().addClasspathResource("single.bpmn").deploy();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .deploymentId(deployment.getId()).singleResult();
        ProcessInstance processInstance = processEngine.getRuntimeService()
                .startProcessInstanceById(processDefinition.getId());
        System.out.println(processInstance.getId());
    }
}

控制台输出:

80004

1.1.3 数据库表

ACT_RU_EXECUTION表新增两条数据,其中id为80004的是主执行流,所有PARENT_ID_指向主执行流ID的都是子执行流。这里只有一个子执行流

11 API(6)启动流程-流程实例_第3张图片

 

1.2 多个流程案例

1.2.1 流程图

11 API(6)启动流程-流程实例_第4张图片

1.2.2 代码

package com.study.c11;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;

public class Multi {

    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService.createDeployment().addClasspathResource("multi.bpmn").deploy();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .deploymentId(deployment.getId()).singleResult();
        ProcessInstance processInstance = processEngine.getRuntimeService()
                .startProcessInstanceById(processDefinition.getId());
        System.out.println(processInstance.getId());
    }
}

控制台输出:

82504

1.2.3 数据库表

ACT_RU_EXECUTION表新增两条数据,其中id为82504的是主执行流,所有PARENT_ID_指向主执行流ID的都是子执行流。这里有两个子执行流

11 API(6)启动流程-流程实例_第5张图片

 

2. 启动流程

2.1 startProcessInstanceById

参数指的是流程定义的id

2.2 startProcessInstanceByKey

参数指的是定义在流程文件中的process标签的id属性的值

2.3 startProcessInstanceByMessage

接收到外部的消息,这个消息符合定义的消息之后就会启动流程。

 

3. 设置与查询流程参数

流程的本地参数(前面讲到的是任务的本地参数)

3.1 API

//设置执行流的本地变量
runtimeService.setVariablesLocal(execution.getId(),params);
//设置执行流的全局变量
runtimeService.setVariable(execution.getId(),"globalVar","cba");

3.2 案例

3.2.1 流程图

11 API(6)启动流程-流程实例_第6张图片

3.2.2 代码

package com.study.c11;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.util.HashMap;
import java.util.List;

public class Scope {

    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("scope.bpmn").deploy();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .deploymentId(deployment.getId()).singleResult();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
        TaskService taskService = processEngine.getTaskService();
        List taskList = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
        HashMap params = new HashMap<>();
        params.put("localVar","abc");
        for (Task task : taskList) {
            Execution execution = runtimeService.createExecutionQuery()
                    .executionId(task.getExecutionId()).singleResult();
            if(task.getName().equals("UserTask1")){
                runtimeService.setVariablesLocal(execution.getId(),params);
            }else{
                runtimeService.setVariable(execution.getId(),"globalVar","cba");
            }
        }
        for (Task task : taskList) {
            taskService.complete(task.getId());
        }
        Task task3 = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
        System.out.println(runtimeService.getVariableLocal(task3.getExecutionId(),"localVar"));
        System.out.println(runtimeService.getVariable(task3.getExecutionId(),"globalVar"));
    }
}

控制台输出:

null
cba

可见,本地参数只能存在于当前的执行流中,全局参数在流程实例整个生命周期都可以拿到。

你可能感兴趣的:(Activiti)