复习步骤7-Activiti启动流程

说明,子流程 -- 即子执行流

activiti _ru_ Runtime这种表都是保存运行时即流程运行时,即流程没走完end

       节点时数据,会随着流程流转的节点随时变化的,

       act_ru_execution -- 保存运行时 当前节点 下的 主流程(主执行流)和子执行流 数据

       act_ru_task   -- 保存此时 正在流转即当前节点的数据(子执行流 任务)

activiti ProcessInstance(流程实例) 和 Execution(执行流)

ProcessInstance 流程实例,是主执行流 继承Execution

启动流程,会创建流程实例,此是会在act_ru_execution中保存数据(主流程(主执行流)数据、子执行流数据--里面是保存当前节点下的主流程数据、子执行流数据),

如果只有一个流程分支的话,还会在此表中创建一条子执行流数据,会引用主流程数据的id,

如果有多个分支就会创建多个子执行流数据

 

  如图,一个分支的流程

/**

     * activiti ProcessInstance(流程实例) Execution(执行流)

     * 测试 一个流程分支  act_ru_execution中保存数据(主流程数据、子执行流数据)情--

     * -- 如果是一个流程分支,会产生一个主流程数据,和创建一条子执行流数据,会引用主流程数据的id

     */

    public void oneProTest(){

 

数据库act_ru_execution表 中生成数据如下图

 

 

如图,多个分支的流程

/**

     * activiti ProcessInstance(流程实例) Execution(执行流)

     * 测试 多个流程分支  act_ru_execution中保存数据(主流程数据、子执行流数据)情--

     * -- 如果是多个流程流程分支,会产生一个主流程数据,和创建多条子执行流数据,都会引用主流程数据的id

     */

数据库 act_ru_execution表 中生成数据如下图

 

startProcessInstanceById :查询参数Deploymentid

startProcessInstanceByKey :查询参数 act_re_procdefKEY_manypro.bpmn <process id="myProcess" id

startProcessInstanceByMessage : 查询参数 待定

 

 

项目结构如图

 

 

/**  设置与查询流程参数

     * activiti ProcessInstance(流程实例) Execution(执行流)

     *测试子执行流taskA设置一个本地参数,测试子执行流taskB设置一个本地参数,再流转到taskC

     *时,两个执行流taskAtaskB都执行完毕(complete),只剩下一个主流程和一个子执行流(观察 act_ru_execution--查此时只剩下一个主流程和一个子执行流

     *在流转到taskC之前,即在taskAtaskB时未执行complete,之前,act_ru_execution表表有一个主流程和两个子执行流taskAtaskB)

     *此时获取taskAtaskB设置的参数,发现taskA设置的本地参数获取出来为null,全局参数可正常获取

     */

 

ProTest.java

package com.xiangshuai.act.c11;

 

import java.util.List;

 

import org.activiti.engine.ProcessEngine;

import org.activiti.engine.ProcessEngines;

import org.activiti.engine.RepositoryService;

import org.activiti.engine.RuntimeService;

import org.activiti.engine.TaskService;

import org.activiti.engine.impl.event.logger.handler.TaskAssignedEventHandler;

import org.activiti.engine.repository.Deployment;

import org.activiti.engine.repository.ProcessDefinition;

import org.activiti.engine.runtime.ProcessInstance;

import org.activiti.engine.task.Task;

import org.w3c.dom.ls.LSInput;

 

/**

 * * @author lqx

 * 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤7-Activiti启动流程

 * 或 我的网盘\我的笔记学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤7-Activiti启动流程

 *

 *

 * */

public class ProTest {

 

         public static void main(String[] args) {

           //manyProTest();

                     proVarScopeTest();

         }

        

    /**

     * activiti ProcessInstance(流程实例) 和 Execution(执行流)

     * 测试 一个流程分支  act_ru_execution中保存数据(主流程数据、子流程数据)情--

     * -- 如果是一个流程分支,会产生一个主流程数据,和创建一条子流程数据,会引用主流程数据的id,

     */

    public static void oneProTest(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务

             RuntimeService runService = engine.getRuntimeService();

             // 任务服务

             TaskService taskService = engine.getTaskService();

            

             //部署流程

             Deployment dep = rs.createDeployment().addClasspathResource("onepro.bpmn").deploy();

            

             ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

             // 启动流程实例

             ProcessInstance pi = runService.startProcessInstanceById(pd.getId());

    }

    /**

     * activiti ProcessInstance(流程实例) 和 Execution(执行流)

     * 测试 多个流程分支  act_ru_execution中保存数据(主流程数据、子流程数据)情--

     * -- 如果是多个流程流程分支,会产生一个主流程数据,和创建多条子流程数据,都会引用主流程数据的id,

     */

    public static void manyProTest(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务

             RuntimeService runService = engine.getRuntimeService();

             // 任务服务

             TaskService taskService = engine.getTaskService();

            

             //部署流程

             Deployment dep = rs.createDeployment().addClasspathResource("manypro.bpmn").deploy();

            

             ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

             // 启动流程实例

             ProcessInstance pi = runService.startProcessInstanceById(pd.getId());

    }

   

   

    /**  设置与查询流程参数

     * activiti ProcessInstance(流程实例) 和 Execution(执行流)

     *测试子执行流taskA设置一个本地参数,测试子执行流taskB设置一个本地参数,再流转到taskC

     *时,两个执行流taskA和taskB都执行完毕(complete),只剩下一个主流程和一个子执行流(观察 act_ru_execution表--查此时只剩下一个主流程和一个子执行流

     *在流转到taskC之前,即在taskA和taskB时未执行complete,之前,act_ru_execution表表有一个主流程和两个子执行流taskA和taskB),

     *此时获取taskA和taskB设置的参数,发现taskA设置的本地参数获取出来为null,全局参数可正常获取

     */

    public static void proVarScopeTest(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务

             RuntimeService runService = engine.getRuntimeService();

             // 任务服务

             TaskService taskService = engine.getTaskService();

            

             //部署流程

             Deployment dep = rs.createDeployment().addClasspathResource("provar.bpmn").deploy();

            

             ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

             // 启动流程实例

             ProcessInstance pi = runService.startProcessInstanceById(pd.getId());

            

             /*

             断点观察act_ru_execution表在流转到taskC之前,即在taskA和taskB时未执行complete,之前,act_ru_execution表表有一个主流程和两个子执行流taskA和taskB

             act_ru_task表 有子执行任务 TaskA和taskB

             */

             // 查询此时正在执行的流程任务 act_ru_task表-- 启动流程实例后,自动跳到下一个节点任务,即两子执行流任务节点 ,

             List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();

             System.out.println(list.size());

             list.forEach((task)->{

                     if("taskA".equals(task.getName())){//遍历如果是taskA 节点,设局部变量 taskVarA

                              taskService.setVariableLocal(task.getId(), "taskVarA", "taskA节点上设置的局部变量");//在任务上设置变量。 setVariable(String taskId, String variableName, Object value)

                     }

                     if("taskB".equals(task.getName())){//遍历如果是taskB 节点,设全局变量 taskVarB

                              taskService.setVariable(task.getId(), "taskVarB", "taskB节点上设置的全局变量");//在任务上设置变量。 setVariable(String taskId, String variableName, Object value)

                     }

                    

             });

            

             list.forEach((task)->{//将两子执行流全部执行完,流转到taskC节点

                      taskService.complete(task.getId());

             });

             /*

             断点观察act_ru_execution  执行完taskA和taskB(complete) 此时在taskC,观察act_ru_execution表剩下一个主流程和一个子执行流,act_ru_task表

             只剩下执行任务taskC

             */

             //获取taskA和taskB设置的参数

             Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();//获取此时的流程节点,即taskC

             System.out.println("taskVarA"+taskService.getVariable(task.getId(), "taskVarA"));//getVariableLocal(String taskId, String variableName)

             System.out.println("taskVarA"+taskService.getVariable(task.getId(), "taskVarB"));//getVariableLocal(String taskId, String variableName)

            

             //输出结果 taskVarAnull

             //taskVarAtaskB节点上设置的全局变量

            

             taskService.complete(task.getId());

            

             /*

             断点观察act_ru_execution  执行完taskC(complete),观察act_ru_execution表剩下一个主流程和一个子执行流,act_ru_task表

             全空了,也证明了 activiti _ru_ 即 Runtime这种表都是保存运行时即流程运行时,即流程没走完end

             节点时数据,会随着流程流转的节点随时变化的,

             act_ru_execution -- 保存运行时 当前节点 下的 主流程和一个子执行流 数据

             act_ru_task   -- 保存此时 正在流转即当前节点的数据(子执行流 数据)

             */

    }

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值