Activiti学习笔记三

本文深入探讨了Activiti流程引擎的部署、启动、任务管理及流程变量设置与获取的全过程,详细介绍了流程定义、部署、启动流程实例、任务查询与完成、流程变量的设置与获取等关键操作。

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

流程定义

管理流程定义

/**
     * 流程部署方式1
     */
    private ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("/activiti.cfg.xml").buildProcessEngine();
    @Test
    public void deployProcess(){
        //得到RepositoryService
        RepositoryService service = processEngine.getRepositoryService();
        //部署
        InputStream isBpmn = this.getClass().getResourceAsStream("/LeaveBill.xml");
        InputStream isPng = this.getClass().getResourceAsStream("/LeaveBill.png");
        Deployment deployment = service.createDeployment().name("请假流程001")//部署的名称
                .addInputStream("LeaveBill.bpmn", isBpmn)//设置;流程图的xml文件
                .addInputStream("LeaveBill.png", isPng)//设置流程图的PNG文件
                .deploy();//确定
        /**
         * act_re_deployment:流程部署表
         * act_re_model:
         * act_re_procdef:流程定义表,它和部署表里面的数据是一一对应的
         * act_ge_bytearray:二进制文件存放表,和部署表和定义表是2-1关系
         * act_ge_property:系统内置表存放activiti的版本和自动增长的字段
         */

        System.out.println("流程部署成功:");
        System.out.println("部署ID:" + deployment.getId());
        System.out.println("部署名称:" + deployment.getName());
        System.out.println("部署时间:" + deployment.getDeploymentTime().toLocaleString());
    }

    /**
     * 流程部署方式2
     */
    @Test
    public void deployProcess2(){
        //得到RepositoryService
        RepositoryService service = processEngine.getRepositoryService();
        //部署
        Deployment deployment = service.createDeployment().name("请假流程002")//部署的名称act_re_deployment-name
                .addClasspathResource("LeaveBill.xml")//指src下面的文件
                .addClasspathResource("LeaveBill.png")//指src下面的文件
                .deploy();//确定部署
        System.out.println("流程部署成功:");
        System.out.println("部署ID:" + deployment.getId());
        System.out.println("部署名称:" + deployment.getName());
        System.out.println("部署时间:" + deployment.getDeploymentTime().toLocaleString());
    }
    /**
     * 流程部署方式3
     */
    @Test
    public void deployProcess3_zip(){
        //得到RepositoryService
        RepositoryService service = processEngine.getRepositoryService();
        //部署
        InputStream is = this.getClass().getResourceAsStream("/LeaveBill.zip");
        ZipInputStream zipInputStream = new ZipInputStream(is);
        Deployment deployment = service.createDeployment().name("请假流程003")//部署的名称
                .addZipInputStream(zipInputStream)
                .deploy();//确定部署
        System.out.println("流程部署成功:");
        System.out.println("部署ID:" + deployment.getId());
        System.out.println("部署名称:" + deployment.getName());
        System.out.println("部署时间:" + deployment.getDeploymentTime().toLocaleString());
    }

查看流程部署

    /**
     * 查看流程部署
     */
    @Test
    public void findProcessDeployment(){
        //得到流程管理的服务
        RepositoryService repositoryService = this.processEngine.getRepositoryService();
        List<Deployment> list = repositoryService.createDeploymentQuery()//创建查询分析器
                //where
                //.deploymentId()//通过部署ID查询流程部署act_re_deployment的id
                //.deploymentName()
                //.deploymentNameLike()
                //排序
                //.asc()
                //.desc()
                //结果集
                //.count();//查询流程部署的总根据条数
                //.singleResult()//查询单个结果集
                .list();//返回数据的结果
        if (list != null && list.size() > 0){
            for(Deployment deployment : list){
                System.out.println("流程部署成功:");
                System.out.println("部署ID:" + deployment.getId());
                System.out.println("部署名称:" + deployment.getName());
                System.out.println("部署时间:" + deployment.getDeploymentTime().toLocaleString());
            }
        }

    }

查看流程的定义

/**
     * 查看流程定义
     */
    @Test
    public void findProcessDefinition(){
        //得到流程管理的服务
        RepositoryService repositoryService = this.processEngine.getRepositoryService();
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()//创建查询分析器
                //where查询
                //.deploymentId("")//通过部署ID查询流程部署act_re_deployment的id
                //.deploymentIds()//根据部署ID的set集合查询
                //.processDefinitionId()//根据流程定义的ID查询act_re_procdef的ID
                //.processDefinitionKey()//根据流程定义的KEY查询act_re_procdef的KEY
                //.processDefinitionKeyLike("%" + key + "%")//根据流程定义的KEY模糊查询act_re_procdef的KEY
                //.processDefinitionName()//根据流程定义的NAME查询act_re_procdef的NAME
                //.processDefinitionNameLike("%" + NAME + "%")//根据流程定义的NAME模糊查询act_re_procdef的NAME
                //.processDefinitionResourceName()//根据流程定义的RESOURCE_NAME查询act_re_procdef的RESOURCE_NAME
                //.processDefinitionResourceNameLike("%" + resouce_name + "%")//根据流程定义的RESOURCE_NAME模糊查询act_re_procdef的RESOURCE_NAME
                //.processDefinitionVersion()//根据版本查询
                //排序
                //.orderByDeploymentId().asc()//根据流程部署的ID 升序查询
                //.orderByProcessDefinitionKey().asc()//根据流程定义的KEY 升序查询
                .orderByProcessDefinitionId().desc()//根据流程定义的ID 降序查询
                //.orderByProcessDefinitionName().asc()//根据流程定义的NAME 升序查询
                //.asc()
                //.desc()
                //结果集
                //.count();//根据部署的总根据条数
                //.singleResult()//查询单个结果集
                .list();//返回数据的结果
        if (list != null && list.size() > 0){
                for(ProcessDefinition processDefinition : list){
                    System.out.println("流程定义ID:" + processDefinition.getId());
                    System.out.println("流程定义名称:" + processDefinition.getName());
                    System.out.println("流程定义KEY:" + processDefinition.getKey());
                    System.out.println("流程定义BPMN的文件名:" + processDefinition.getResourceName());
                    System.out.println("流程定义版本号:" + processDefinition.getVersion());
                }
            }
    }

删除流程定义

    /**
     * 删除流程定义
     */
    @Test
    public void deleteProcessDefinition(){
        //得到流程管理的服务
        RepositoryService repositoryService = this.processEngine.getRepositoryService();
        String deploymentId = "";
        //repositoryService.deleteDeployment(deploymentId);//根据部署ID删除流程定义 如果当前流程正在执行,删除会报异常
        repositoryService.deleteDeployment(deploymentId,true);//根据部署ID删除流程定义 cascade=false 它和上面的删除方法一样
                                                                  //cascade=true 删除正在执行的流程,不会抛出异常
        System.out.println("删除成功");
    }

获取流程定义文档的资源(获得图片)

/**
     * 获取流程定义文档的资源(查看流程图附件)
     */
    @Test
    public void viewProcessDefinitionImg(){
        //得到流程管理的服务
        RepositoryService repositoryService = this.processEngine.getRepositoryService();
        //String processDefinitionId = "";
        //InputStream inputStream = repositoryService.getProcessDiagram(processDefinitionId);
        //如果只知道流程部署ID如何查询
        String deploymentId = "";
        ProcessDefinition processDefinition = (ProcessDefinition) repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId);
        String processDefinitionId = processDefinition.getId();
        InputStream inputStream = repositoryService.getProcessDiagram(processDefinitionId);
        try {
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("/opt"));
            byte [] b = new byte[1024];
            int len = 0;
            while((len = inputStream.read(b)) != -1){
                bos.write(b,0,len);
            }
            bos.flush();
            bos.close();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

查询最新版本的流程定义

    /**
     * 附加功能:查询最新版本的流程定义
     */
    @Test
    public void findMaxVersionProcessDefinition(){
        //得到流程管理的服务
        RepositoryService repositoryService = this.processEngine.getRepositoryService();
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
                .orderByProcessDefinitionKey().desc()
                .orderByProcessDefinitionVersion().asc()
                .list();
        Map<String,ProcessDefinition> map = new HashMap<>();
        if(list != null && list.size() > 0){
            for(ProcessDefinition processDefinition : list){
                map.put(processDefinition.getKey(),processDefinition); 
            }
        }
        Collection<ProcessDefinition> collection = map.values();
        for(ProcessDefinition processDefinition : collection){
            System.out.println("流程定义ID:" + processDefinition.getId());
            System.out.println("流程定义名称:" + processDefinition.getName());
            System.out.println("流程定义KEY:" + processDefinition.getKey());
            System.out.println("流程定义BPMN的文件名:" + processDefinition.getResourceName());
            System.out.println("流程定义版本号:" + processDefinition.getVersion());
        }
    }

删除key相同的不同版本的流程定义

    /**
     * 附加功能:删除流程定义(删除key相同的所有不同版本的流程定义)
     */
    //已知最高版本的流程实例ID 删除这个流程的所有不同版本
    @Test
    public void deleteAllSameKeyProcessDefinition(){
        String processDefintionId = "";
        //根据ID找到KEY
        //得到流程管理的服务
        RepositoryService repositoryService = this.processEngine.getRepositoryService();
        ProcessDefinition processDefinition = (ProcessDefinition) repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefintionId);
        String processDefinitionKey = processDefinition.getKey();
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey(processDefinitionKey).list();
        for(ProcessDefinition processDefinition1 : list){
            repositoryService.deleteDeployment(processDefinition.getDeploymentId(),true);
        }
    }

总结:

  • Deployment部署对象

    1、一次部署多个文件的信息。对于不需要的流程可以删除和修改

    2、对应的表

    ​ act_re_deployment:部署对象表

    ​ act_re_procdef:流程定义表

    ​ act_ge_bytearray:资源文件表

    ​ act_ge_property:主键生成策略表

  • ProcessDefinition流程定义

    1、解析bpmn后得到的流程定义规则的信息,工作流系统就是按照流程定义的规则执行的。

  • 关于修改

    修改其它就是重新部署

    重新部署之后老版本的还没执行完成的流程还是按老版本的支持

    新的流程启动就使用新的版本去启动

流程实例、任务的执行

启动流程

    /**
     * 启动流程
     */
    @Test
    public void startProcess(){
        RuntimeService runtimeService = this.processEngine.getRuntimeService();
        //根据流程定义的KEY去启用流程
        String processDefinitionKey = "";
        runtimeService.startProcessInstanceByKey(processDefinitionKey);
        //根据流程定义的KEY去启用流程,并设置流程变量 variables必须是Map<String,Object>的对象
        Map<String,Object> variables = new HashMap<>();
        variables.put("请假天数",5);
        variables.put("请假时间",new Date());
        variables.put("请假原因","回家");
        runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
        //根据流程定义的key去启用流程,并设置业务ID和流程变量 act_hi_procinst 里面的bussinessKey会有数据
        //请假单
        String businessKey = "LeaveBill:1001";
        runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey);
        //根据流程定义的KEY去启用流程,并设置业务ID和流程变量act_hi_procinst 里面的bussinessKey会有数据
        runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey,variables);
        System.out.println("启动成功");
    }

查询个人任务

/**
     * 查询个人任务
     */
    @Test
    public void findUserTask(){
        //任务办理人
        String assignee = "张三";
        //得到任务的Service
        TaskService taskService = this.processEngine.getTaskService();
        //创建一个查询
        //Task task = taskService.createTaskQuery().taskId("").singleResult();
        List<Task> list = taskService.createTaskQuery()
                //where
                .taskAssignee(assignee)//根据任务办理人查询
                //.deploymentId()//根据部署ID去查询
                //.deploymentIdIn()//根据部署ID的Set集合查询
                //.executionId()//根据流程实例ID查询
                //.processDefinitionId()//根据流程定义ID act_re_procdef id
                //.processDefinitionKey()//根据流程定义的Key去查询act_re_procdef key
                //.processDefinitionName()//根据流程定义的名称去查询 act_re_procdef name
                //.processInstanceBusinessKey()//根据流程实例的业务查询
                //.processInstanceId()//根据流程实例ID查询 act_ru_task PROC_INST_ID
                //.processVariableValueEqualsIgnoreCase("请假天数",5)//根据变量查询
                //排序
                //.orderByTaskCreateTime().asc()//根据任务创建时间升序
                //结果集
                //.count()//查询条数
                //.singleResult()//返回单个结果集
                //.listPage(firstResult,maxResults)//分页使用
                .list();//返回集合

        if(list != null && list.size() > 0){
            for(Task task : list){
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务办理人:" + task.getAssignee());
                System.out.println("流程执行实例ID:" + task.getExecutionId());
                System.out.println("任务名称:" + task.getName());
                System.out.println("流程定义ID:" + task.getProcessDefinitionId());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("任务创建时间:" + task.getCreateTime());
            }
        }
    }

办理任务

    /**
     * 办理任务
     */
    @Test
    public void completeTask(){
        TaskService taskService = this.processEngine.getTaskService();
        String taskId = "";
        taskService.complete(taskId);//完成任务
        Map<String,Object> variables = new HashMap<>();
        taskService.complete(taskId,variables);//完成任务并设置流程变量
        System.out.println("任务完成");
    }

判断流程是否完成

    /**
     * 如何判断流程是否完成
     */
    @Test
    public void isProcessComplete(){
        //已经结束的流程实例ID
        String processInstanceId = "";
        RuntimeService runtimeService = this.processEngine.getRuntimeService();
        ProcessInstance processInstance = (ProcessInstance) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId);
        if(processInstance == null){
            System.out.println("流程已结束");
        }else{
            System.out.println("流程未结束");
        }
    }

说明:

  • 因为是任务查询,所以从processEngine中应该得到TaskService
  • 使用TaskService获取到任务查询对象TaskQuery
  • 为查询对象添加查询过滤条件,使用taskAssignee指定任务的办理者(即查询指定用户的代办任务),同时可以添加分页排序等过滤条件
  • 调用list方法执行查询,返回办理者为指定用户的任务列表
  • 任务ID,名称,办理人,创建时间可以从act_ru_task表中查到
  • Execution与ProcessInstance在前面的情况中,ProcessInstance相当Execution
  • 如果assignee属性为部门经理,结果为空,因为现在流程只到了填写请假申请阶段,后面的任务还没有执行,即在数据库中没有部门经理可以办理的任务,所以查询不到
  • 一个Task节点和Execution节点是1对1的情况,在task对象中使用Execution来表示他们之间的关系
  • 任务ID在数据库表act_ru_task中对应ID列

在流程执行的过程中,创建的流程实例ID在整个过程中都不会变,当流程结束后,流程实例将会在正在执行的执行对象表中(act_ru_execution)被删除

说明:

  • 因为是查询流程实例,所以先获取RuntimeService
  • 创建流程实例查询对象,设置实例ID过滤参数
  • 由于一个流程实例ID只对应一个实例,使用singleResult执行查询返回一个唯一的结果,如果结果数量大有1,则抛出异常
  • 判断指定ID的实例是否存在,如果结果为空,则代表流程结束,实例在正在执行的执行对象表中已被删除,转换为历史数据。

查询历史任务

    /**
     * 附加功能,查询历史任务
     */
    @Test
    public void finfHistoryTask(){
        HistoryService historyService = this.processEngine.getHistoryService();
        String taskId = "";
        HistoricTaskInstance task = historyService.createHistoricTaskInstanceQuery()
                //.taskAssignee()
                .taskId(taskId).singleResult();
        System.out.println("任务ID:" + task.getId());
        System.out.println("任务办理人:" + task.getAssignee());
        System.out.println("流程执行实例ID:" + task.getExecutionId());
        System.out.println("任务名称:" + task.getName());
        System.out.println("流程定义ID:" + task.getProcessDefinitionId());
        System.out.println("流程实例ID:" + task.getProcessInstanceId());
        System.out.println("任务创建时间:" + task.getCreateTime());
    }

查询历史流程实例

    /**
     * 附加功能,查询历史流程实例
     */
    @Test
    public void findHistoryProcessInstance(){
        HistoryService historyService = this.processEngine.getHistoryService();
        String processInstanceId = "";
        HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId);
        System.out.println(historicProcessInstanceQuery);
    }

总结:

Execution执行对象

按流程定义的规则执行一次的过程

对应的表:

​ act_ru_execution:正在执行的信息

​ act_hi_procinst:已经执行完的历史流程实例信息

​ act_hi_actionst:存放历史所有完成的活动

ProcessInstance流程实例

特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个

注意:

​ 1、如果是单例流程,执行对象ID就是流程实例ID

​ 2、如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同

​ 3、一个流程中,流程实例只有1个,执行对象可以存在多个

Task任务

执行到某任务环节时生成的任务信息

对应的表:

​ act_ru_task:正在执行的任务信息

​ act_hi_taskinst:已经执行完成的历史任务信息

设置和获取流程变量

部署流程

@Test
    public void deployProcess(){
        //得到RepositoryService
        RepositoryService service = processEngine.getRepositoryService();
        //部署
        InputStream isBpmn = this.getClass().getResourceAsStream("/LeaveBill.xml");
        InputStream isPng = this.getClass().getResourceAsStream("/LeaveBill.png");
        Deployment deployment = service.createDeployment().name("请假流程001")//部署的名称
                .addInputStream("LeaveBill.bpmn", isBpmn)//设置;流程图的xml文件
                .addInputStream("LeaveBill.png", isPng)//设置流程图的PNG文件
                .deploy();//确定
        /**
         * act_re_deployment:流程部署表
         * act_re_model:
         * act_re_procdef:流程定义表,它和部署表里面的数据是一一对应的
         * act_ge_bytearray:二进制文件存放表,和部署表和定义表是2-1关系
         * act_ge_property:系统内置表存放activiti的版本和自动增长的字段
         */

        System.out.println("流程部署成功:");
        System.out.println("部署ID:" + deployment.getId());
        System.out.println("部署名称:" + deployment.getName());
        System.out.println("部署时间:" + deployment.getDeploymentTime().toLocaleString());
    }

启动流程

@Test
    public void startProcess(){
        RuntimeService runtimeService = this.processEngine.getRuntimeService();
        //根据流程定义的KEY去启用流程
        String processDefinitionKey = "";
        runtimeService.startProcessInstanceByKey(processDefinitionKey);
        //根据流程定义的KEY去启用流程,并设置流程变量 variables必须是Map<String,Object>的对象
        Map<String,Object> variables = new HashMap<>();
        variables.put("请假天数",5);
        variables.put("请假时间",new Date());
        variables.put("请假原因","回家");
        runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
        //根据流程定义的key去启用流程,并设置业务ID和流程变量 act_hi_procinst 里面的bussinessKey会有数据
        //请假单
        String businessKey = "LeaveBill:1001";
        runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey);
        //根据流程定义的KEY去启用流程,并设置业务ID和流程变量act_hi_procinst 里面的bussinessKey会有数据
        runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey,variables);
        System.out.println("启动成功");
    }

设置流程变量

@Test
    public void setVariables(){
        //1、启动流程时设置
        RuntimeService runtimeService = this.processEngine.getRuntimeService();
        String processDefinitionKey = "";
        Map<String,Object> variables = new HashMap<>();
        variables.put("请假天数",5);
        variables.put("请假时间",new Date());
        variables.put("请假原因","回家");
        runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);


        //2、使用执行实例id去设置
        String executionid = "";
        runtimeService.setVariable(executionid,"测试1","测试1");
        Map<String,Object> variable = new HashMap<>();
        variable.put("请假天数",5);
        variable.put("请假时间",new Date());
        variable.put("请假原因","回家");
        runtimeService.setVariables(executionid,variable);
        runtimeService.setVariable(executionid,"测试2","测试2");
        runtimeService.setVariable(executionid,"测试3",10.001);
        runtimeService.setVariable(executionid,"person",new Person(1,"小明"));



        //3、完成任务的时候去设置
        TaskService taskService = this.processEngine.getTaskService();
        String taskId = "";
        Map<String,Object> map = new HashMap<>();
        map.put("测试2","测试3");;
        taskService.complete(taskId,map);

    }

perosn类

实现序列化和序列化id的统一

public class Person implements Serializable {

    private static final long serialVersionUID = 1L;

    private int id;
    private String name;

    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

获取流程变量

 /**
     * 获取流程变量
     */
    @Test
    public void getVariables(){
        //1、使用执行实例ID和流程变量的NAME去获取
        RuntimeService runtimeService = this.processEngine.getRuntimeService();
        String executionid = "";
        Object day = runtimeService.getVariable(executionid, "请假天数");
        Object time = runtimeService.getVariable(executionid, "请假时间");
        Object content = runtimeService.getVariable(executionid, "请假原因");
        System.out.println(day);
        System.out.println(time);
        System.out.println(content);

        //2、使用任务ID去得到流程变量
        TaskService taskService = this.processEngine.getTaskService();
        String taskId = "";
        Object days = taskService.getVariable(taskId, "请假天数");
        Person person = (Person) taskService.getVariable(taskId, "person");
        System.out.println(days);
        System.out.println(person);
    }

查询历史流程变量

 /**
     * 查询历史流程变量
     */
    @Test
    public void findHistoryVariables(){
        HistoryService historyService = this.processEngine.getHistoryService();
        String executionId = "";
        List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().executionId(executionId).list();
        for (HistoricVariableInstance hvi : list){
            System.out.println("历史变量类型名称:" + hvi.getVariableTypeName());
            /**
             * 历史任务id为空,因为变量可以在流程的任意时刻都可以获取
             * 所以历史任务id无意义
             */
            System.out.println("历史任务ID:" + hvi.getTaskId());
            System.out.println("历史实例ID:" + hvi.getProcessInstanceId());
            System.out.println("历史变量名称:" + hvi.getVariableName());
            System.out.println("历史变量创建时间:" + hvi.getCreateTime());
            System.out.println("历史变量的值:" + hvi.getValue());
        }
    }
流程执行历史记录

查询历史流程实例

    /**
     * 查询历史流程实例
     */
    @Test
    public void findHistoryProcessInstance(){
        List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().list();
        for (HistoricProcessInstance hpi : list){
            System.out.println("部署ID:" + hpi.getDeploymentId());
            System.out.println("名称:" + hpi.getName());
            System.out.println("流程定义KEY:" + hpi.getProcessDefinitionKey());
            System.out.println("流程定义名称:" + hpi.getProcessDefinitionName());
            System.out.println("开始时间" + hpi.getStartTime());
            System.out.println("结束时间:" + hpi.getEndTime());
        }
    }

查询历史活动

/**
     * 查询历史活动
     */
    @Test
    public void findHistoryActivit(){
        List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().list();
        for(HistoricActivityInstance hai : list){
            System.out.println("活动ID:" + hai.getActivityId());
            System.out.println("活动名称:" + hai.getActivityName());
            System.out.println("活动类型:" + hai.getActivityType());
            System.out.println("办理人:" + hai.getAssignee());
            System.out.println("执行实例ID:" + hai.getExecutionId());
            System.out.println("定义ID:" + hai.getProcessDefinitionId());
            System.out.println("流程实例ID:" + hai.getProcessInstanceId());
            System.out.println("任务ID:" + hai.getTaskId());
            System.out.println("持续时间:" + hai.getDurationInMillis());
            System.out.println("开始时间:" + hai.getStartTime());
            System.out.println("结束时间:" + hai.getEndTime());
        }
    }

查询历史任务

/**
     * 查询历史任务
     */
    @Test
    public void findHistoryTask(){
        List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().list();
        for(HistoricTaskInstance hti : list){
            System.out.println("办理人:" + hti.getAssignee());
            System.out.println("执行实例iD:" + hti.getExecutionId());
            System.out.println("任务名称:" + hti.getName());
            System.out.println("定义ID:" + hti.getProcessDefinitionId());
            System.out.println("流程实例ID:" + hti.getProcessInstanceId());
            System.out.println("活动KEY:" + hti.getTaskDefinitionKey());//就是活动节点
        }
    }

总结:

流程变量

在流程执行或者任务执行的过程中,用于设置和获取变量,使用;流程变量在流程传递的过程中传递业务参数

对应的表:

​ act_ru_variable:正在执行的流程变量表

​ act_hi_varinst:流程变量历史表

扩展知识:setVariable和setVariableLocal的区别

setVariable:设置流程变量的时候,流程变量名称相同的时候,后一次的值替换前一次的值,而且可以看到
TASK_ID的字段不会存放任务ID的值

serVariableLocal:

​ 1、设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在2个活动节点,对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替换前一次版本的值,她会使用不同的任务ID作为标识,存放2个流程变量值,而且可以看到TASK_ID的字段会存放ID的值,例如act_hi_varinst表的数据:不同的任务节点,即使流程变量名称相同,存放的值也是不同的。

​ 2、还有,使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值