activiti之流程变量

author author     2022-09-23     631

关键词:

所谓的流程变量,大概也就是和咱们业务相关的数据,例如我要请假,那我得知道是谁在请假请假人是谁,也就是我要知道activiti的实体和咱们业务的javaBean如何关联起来。

       下边我们先看一下和流程变量的数据库表都有哪些,当然我们自己建的表的不说了,都是流程变量。哈哈。

       act_ru_task(正在执行的任务表)和act_hi_taskinst(正在执行的任务表)

       主要记录了正在执行的任务名称,流程实例ID,流程定义DI,任务的key,和流程变量信息。

  技术分享

       技术分享

          历史任务表记录的信息和正在执行的任务表信息都一样,区别就在于一个是全部的信息,一个事正在执行的任务相关信息。

       act_hi_comment

      因为是多用于对业务的操作,这个表主要记录了一些不同用于对同一个事件不同的看法,以方便其他用户做参考。例如请假,项目经理一说:我的员工老师加班,就得给家,主任也就直接给了。对吧。

     技术分享

      act_ru_execute(正在执行的实例表)注意business_key,这个字段是我们自定义的,我的方法就是实例 + “.” + "业务ID"

技术分享

      act_ru_variable(正在执行的 流程定义表信息)

     技术分享

       好的,activiti提供的表有流程变量的就是这些表了,既然有了这些表,那么我们看一下这些表在我们业务实现的时候都是如何来运用的。下边我通过两个实例,一个是我在画流程图是写好流程实例,一个是运用javaBean来实现。

       简单实例

      部署并启动流程实例

[java] view plain copy

  1. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  

  2.   

  3. /**部署流程定义从(inputStream)*/  

  4. @Test  

  5. public void deploymentProcessDefinition_input(){  

  6.     InputStream inputStreamBpmn = this.getClass().getResourceAsStream("/diagrams/porcessVariables.bpmn");  

  7.     InputStream inputStreamPng = this.getClass().getResourceAsStream("/diagrams/porcessVariables.png");  

  8.     Deployment deployment = processEngine.getRepositoryService()  //用于流程定义和部署相关对象的Service  

  9.                     .createDeployment()   //创建一个部署对象  

  10.                     .name("hellworld部门程序")  

  11.                     .addInputStream("porcessVariables.bpmn", inputStreamBpmn) //使用资源名称和输入流(与资源文件的名称要一直)  

  12.                     .addInputStream("porcessVariables.png", inputStreamPng)  

  13.                     .deploy();  

  14.       

  15.     System.out.println("deployment" + deployment.getId());   //1  

  16.     System.out.println("deployment" + deployment.getName());//部门程序  

  17.   

  18. }  

  19.   

  20. @Test  

  21. public void startProcessInstance() {  

  22.     //流程定义的key  

  23.     String processInstenceKey = "processVariables";  

  24.     ProcessInstance pi = processEngine.getRuntimeService() //与正在执行的流程实例和执行对象相关的service  

  25.             .startProcessInstanceByKey(processInstenceKey); //使用流程定义的key来启动流程实例helloworld.bpmn的id,使用key启动,默认用最新的版本启动  

  26.     System.out.println("流程实例id:" + pi.getId());  //流程实例id   

  27.     System.out.println("流程定义id:" + pi.getProcessDefinitionId());   //流程定义ID helloworld:1:4  

  28.       

  29. }  

       当我们启动以后是没有流程变量的,但是接下来我们就要设置了,如果我们在我们话流程图的时候设置好了的话,例如在单击bpmn中的某一个任务,选择Main config,然后在Assign这写上”张三“,那么我们就要启动张三的的业务流程的话,则需要如下代码来这是:

[java] view plain copy

  1. <pre name="code" class="java">@Test  

  2.     public void setVariables(){  

  3.         String taskId = "2004";  

  4.         TaskService taskService = processEngine.getTaskService();  

  5.         taskService.setVariableLocal(taskId, "请假天数"3);   //与任务ID绑定  

  6.             taskService.setVariable(taskId, "请假日期"new Date());  

  7.         taskService.setVariable(taskId, "请假原因""回家看亲");  

  8.           

  9.         System.out.println("设置成功了");  

  10.     }  

       而上边代码的taskId就是实例启动以后的当前正在执行的任务ID,然后我们去act_ru_variable,act_ru_task等表中都能看到张三的这个名字,但是这样是可以实现,但是我们在实际运用中却都不会这样用,既然是面向对象,我们就应该这样。

      

[java] view plain copy

  1. public class Person implements Serializable {  

  2.   

  3.     /** 

  4.      *  

  5.      */  

  6.     private static final long serialVersionUID = 1L;  

  7.     private Integer id;  

  8.     private String name;  

  9.     public String getName()  {  

  10.         return name;  

  11.     }  

  12.     public Integer getId() {  

  13.         return id;  

  14.     }  

  15.     public void setId(Integer id) {  

  16.         this.id = id;  

  17.     }  

  18.     public void setName(String name) {  

  19.         this.name = name;  

  20.     }  

  21. }  

 

[java] view plain copy

  1. @Test  

  2.     public void setVariables(){  

  3.         String taskId = "2004";  

  4.         TaskService taskService = processEngine.getTaskService();  

  5.         /**使用javaBean*/  

  6.         Person p = new Person();  

  7.         p.setId(20);  

  8.         p.setName("menghaibintest");  

  9.         taskService.setVariable(taskId, "人员信息", p);  

  10.         System.out.println("设置成功了");  

  11.     }  

  12.       


      看一下效果显示
    
技术分享

       那么我们获取一下吧

      

[java] view plain copy

  1. /** 

  2.      * 获取流程变量 

  3.      */  

  4.     @Test  

  5.     public void getVariables(){  

  6.         TaskService taskService = processEngine.getTaskService();  

  7.         String taskId = "404";  

  8.         Person p = (Person)taskService.getVariable(taskId, "人员信息");  

  9.         System.out.println("id:" + p.getId());  

  10.         System.out.println("name" + p.getName());  

  11.     }  

       当然你可能觉得这样还是不够友好,我想把我的业务和工作流的表区分开来,只用主外键来关联,那么下篇博客我来为大家呈现一种耦合性最低的方法。

      简单总结一下就是既然要设置好流程变量,那么就要知道我们的流程变量在数据库中表的位置,和在工作流中如何设置。既然是面向对象,我们就不应该再去使用一个一个设置的方式。


flowable系列之流程变量(代码片段)

流程变量  流程实例按步骤执行时,需要使用一些数据。在Flowable中,这些数据称作变量(variable),并会存储在数据库中。变量可以用在表达式中(例如在排他网关中用于选择正确的出口路径),也可以在... 查看详情

第八篇flowable之流程变量(代码片段)

流程变量  流程实例按步骤执行时,需要使用一些数据。在Flowable中,这些数据称作变量(variable),并会存储在数据库中。变量可以用在表达式中(例如在排他网关中用于选择正确的出口路径),也可以在... 查看详情

阿花宝宝java基础笔记之流程控制

1.各循环可互相嵌套   一般不超过三层   外层循环变量变化一次,内层循环变量要变化一遍  注意点:循环次数。(内层循环次数*外层循环次数)2.break语句的使用 break语句用于终止某个循环,使... 查看详情

django之流程

关键点路由视图模板orm中间件 查看详情

java学习之流程控制语句(选择结构)

 流程控制语句1选择结构ifif语句有三种语法格式,每一种格式都有它自身的特点。1.1if语句if语句是指如果满足某种条件,就进行某种处理。在Java中,if语句的具体语法格式如下:if(条件语句){   执行语句;  ... 查看详情

shell脚本之流程控制

  shell脚本之流程控制shell脚本之流程控制条件语句条件判断循环语句for,while,untilfor循环while循环until循环循环控制语句continue循环控制语句break循环控制shift命令创建无限循环while的特殊用法for的特殊用法select循环与菜单s... 查看详情

javascript基础之流程控制语句

第三部分:流程控制语句JavaScript代码是书写位置:JavaScript代码应该写在<scripttype=”text/javascript”></script>这一对标记中。或者作为外部引用<scriptsrc="JavaScript代码路径"></script>JavaScript的每一句代码请用分号作为... 查看详情

mysql之流程控制语句

参考技术AMYSQL的流程控制语句也只能用于存储过程,主要有3类:跳转语句ITERATE:只能用在循环语句内,表示重新开始循环。LEAVE:可以用在循环语句内,或者以BEGIN和END包裹起来的程序体内,表示跳出循环或跳出程序体的操作。... 查看详情

python之流程控制(代码片段)

Python之流程控制if语句条件判断语句ifa==b:pass#满足条件再执行ifa==b:passelse:pass#满足条件执行第一种语句,不满足条件则执行第二种语句ifa==b:#条件1pass#语句1elifa>b:#条件2pass#语句2else:pass#语句3如果满足条件1,则执行语句1,语句2... 查看详情

存储过程之流程控制语句

阅读目录:通过条件、循环语句,对处理程序进行流程控制条件控制    IF条件:条件为真,执行    CASE条件:匹配到,执行循环控制    WHILE循环:先判断后执行    REPEAT循环:先执行后判断    LOOP循环... 查看详情

java基础之流程控制

一、顺序结构    顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,,就需要使用循环结构。  if-else-if语句语法:  if(条件){        当条件为true时,执行大括号内... 查看详情

mysql之流程函数(代码片段)

...末私信作者,我们一起去大厂。本篇总结的是《MySQL之流程函数》,后续会每日更新~关于《Redis入门到精通》、《并发编程》、《Java全面入门》、《鸿蒙开发》等知识点可以参考我的往期博客相信自己,越活越坚强&#x... 查看详情

java篇之流程控制语句

条件判断语句 条件语句:If(boolean类型)else   (打大括号避免出错)  switch(export)语句:export的类型必须是byte,short,char,int,Stringenum;Switch(export){Case(n):语句;Break;(不输入它的话会顺序执行下一分支,遇到才会跳... 查看详情

java基础之流程语句(代码片段)

JAVA流程语句有几下几种:一、if语句:1.if语句:如果满足条件语句,则执行执行语句;   if(条件语句)    执行语句;     ....;   2.if....else语句:如果满足判断语句,则执行执行语句1,否则执行执行语句2;... 查看详情

puppet之流程控制介绍

1 概述puppet流程控制语句有四种,if,case,selector,unless(3.7版本后引入),由于unless是if单分支语句取反,因此,本文重点介绍if,case,selector三种语法的使用备注:本文的相关内容摘自文章:https://www.dwhd.org/20150609_155030.html2 if语... 查看详情

阿花宝宝java基础笔记之流程控制

1.语法:if(条件1){          //代码1       }elseif(条件2){          //代码块2& 查看详情

2_基本语法之流程控制之循环结构

1.循环结构的四要素  ①初始化条件  ②循环条件--->是boolean类型  ③循环体  ④迭代条件  说明:通常情况下,循环结束都是因为②中循环条件返回false了。2.三种循环结构:  2.1for循环结构  for(①;②;④)  ... 查看详情

java程序猿之流程控制与数组

  分支语句  if括号里的只能是一个逻辑表达式,即这个表达式返回的值只能是true或false。  代码块用花括号括起来,一个代码块通常被当成一个整体来执行(除非遇到return、break、continue等关键字,或者遇到异常)。  ... 查看详情