流程部署设计到的表
act_re_deployment(部署对象表)存放流程定义的显示名和部署时间,每部署一次增加一条记录
act_re_procdef(流程定义表)
存放流程定义的属性信息,
部署每个新的流程都会在这张表中增加一条记录。当流程定义的key相同的情况下,使用的是版本升级。
act_ge_bytearry(资源文件表)
存放流程定义相关的部署信息。即流程定义文档的存放处。每部署一次会增加两条记录,一条是
关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,Folwable会在部署时
解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。
act_ge_property:主键生成策略表。
流程定义相关知识点
流程定义:
流程定义类。可以从这里获得资源文件等。
类似我们定义的java类,提前定义一系列的规则。
流程实例:
代表流程定义的执行实例。如学生张三请了一天的假,他就必须发出一个流程实例的申请。
一个流程实例就表示了所有的运行节点,我们可以利用这个对象来了解当前流程实例的进度等信息。
流程实例就表示一个流程从开始到结束的最大的流程分支,即一个流程中流程实例只有一个。
流程实例通常也可以叫做执行实例的根节点。
流程实例和流程定义为一对多的关系。
执行实例:
ProcessInstance Extends Execution,即ProcessInstance就是Execution。
启动流程的时候会首先创建流程实例,然后创建执行实例。
流程运转过程中永远执行的是自己对应的执行实例。
当所有的执行实例按照规则执行完毕之后,则实例随之结束。
Flowable用这个对象去描述流程执行的每一个节点。
流程按照流程定义的规则执行一次的过程,就可以表示执行对象Execution.
一个流程中,执行对象可以存在多个,但是流程实例只能有一个。
执行实例的父级或者父级的父级为流程实例。
执行实例可能会暂停到某一个活动节点,需要我们去通过特定的api去完成,然后执行实例继续往下走。
节点相关知识点
开始节点:
开始节点代表一个规则的开始。
在一个规则文件中,开始节点只能是一个,不能是多个。如果是多个则部署的时候会报错。
子流程以及引用流程也是如此。开始节点只能是一个。
启动流程的时候,从开始节点让流程实例运行。
结束节点:
结束节点代表一个规则的结束。
在一个规则文件中,结束节点可以是多个。
如果实例运转到结束节点的时候,则表示当前的执行实例要结束了,执行实例结束则流程实例也随之结束。
节点说明:
Flowable中很多类型的事件、活动、网关。
事件有开始事件、结束节点之类的
活动类型比较多,比如人工任务节点,服务任务节点,脚本任务,用户任务等。
活动节点大概分为两类:一种是等待节点,也就是说实例走到这个类型的节点之后,会停留在这个节点,需要
我们手工去完成当前的节点,这样实例才能继续往下运转。一种是非等待节点,也就是说实例走到这个节点的时候,会直接完成。
网关可以根据一些条件规则决定实例往哪个地方运转。
接受任务节点(receivetask)使用-流程定义:
接受任务是一个简单的任务,他会等待对应消息的到达。当前,官方只是实现了这个任务的java定义。当流程达到接收任务,流程状态会保存到数据库中。
在任务创建后,意味着流程会进入等待状态,知道流程引擎接收了一个特定的消息,这会触发流程穿过接收任务继续执行。
接收任务不会向act_ru_task表中插入数据。
任务说明:
在flowable任务中,主要分为两大类查询任务(个人任务和组任务)
确切指定了办理者的任务,这个任务将成为指定者的私有任务,即个人任务
无法指定具体某一个人来办理的任务,即可以把任务分配给几个人或者一到多个小组,让这个范围内的用户可以选择性(如有空余时间时)来办理这类任务,即组任务。
设置个人任务处理人的三种方式:
在bpmn中直接写assignee="张胖子"
在bpmn中写assignee="#{userId}",变量的值要是String类型的,使用流程变脸指定办理人
使用TaskListener接口,要使类实现该接口,在类中定义:delegateTask.setAssignee("张胖子");//指定个人任务的办理人
设置组任务处理人的方式:
在bpmn文件中直接写candidateUsers="张胖子,高胖子"。
在bpmn中写candidateUsers="#{userIds}",变量的值要是String的
使用流程变量指定办理人:
Map<String,Object> vars=new HashMap<String, Object>();
vars.put("userIds","张胖子,高胖子");
使用TaskListener接口,要使类实现该接口,在类中定义:delegateTask.addCandidateUser("张胖子");
组任务说明:
在类中使用delegateTask.addCandidateUser(userId)的方式分配组任务的办理人,此时张胖子和高胖子是下一任务的办理人。
通过taskService.claim(taskId, userId)将组任务分配给个人任务,也叫认领任务。
注意:认领任务的时候,可以是组任务成员中的人,也可以不是组任务成员中的人,此时通过Type的类型为participant来指定任务的办理人。
addCandidateUser()向组任务中添加成员,deleteCandidateUser()删除组任务中的成员。
在开发中,可以将每一个任务的办理人规定好,例如张三的领导是李四和王五,这样张三提交任务,由李四或者王五去查询组任务,可以看到对应张三的申请。李四或者王五再由任务认领的方式,由某个人去完成这个任务。
组任务分配给个人任务(认领任务):taskService.claim(taskId, userId)。
个人任务分配给组任务:taskService.setAssignee(taskId, null)。
个人任务和组任务存放办理人对应的表:
act_ru_identitylink表存放任务的办理人,包括个人任务和组任务,表示正在执行的任务
act_hi_identitylink表存放任务的办理人,包括个人任务和组任务,表示历史任务
如果是个人任务TYPE的类型表示participant(参与者)
如果是组任务TYPE类型表示candidate(候选者)和participant(参与者)
用户行为类:UserTaskActivityBehavior,任务处理方法。handleAssignments()方法
服务任务使用:
服务任务是不等待节点。
执行实例走到服务任务节点之后会继续往下流转。
脚本任务:
脚本任务是不等待节点,经过节点不报错实例继续向下走。
脚本类型有javascript、groovy、juel
网关:
网关分为三种:排他网关、并行网关、兼容网关。
网关主要是为了满足一些特殊的业务,比如排他网关,可以让流程实例出线分支,当有多个条件满足的时候只会走一个执行树。
并行网关有分流和聚合两个功能。
兼容网关可以成为并行网关使用,也可以当做排他网关使用。
变量相关的操作
流程变量相关概念
流程变量在整个工作流中扮演很重要的作用。例如:请假流程中的请假天数、请假原因等一些参数都为流程变量的泛微。
流程变量的作用域范围是只对应一个流程实例。各个流程实例的流程变脸是不相互影响的。
流程实例结束完成以后流程变量还保存在数据库中。
设置全局变量说明
流程变量的作用域是流程实例,所以只要设置就可以,不用管在那个阶段设置。
基本类型设置流程变量,在taskservice中使用任务ID,定义流程变量的名称,设置流程变量的值。
Javabean类型设置流程变量,需要这个javabean实现Serializable接口。
设置流程变量的时候,向act_ru_variable和act_hi_variable表中插入数据。
获取变量说明
流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量是不同的。
使用基本类型获取流程变量,在taskservice中使用任务ID,流程变量的名称,获取流程变量的值。
Javabean类型设置获取流程变量,除了需要这个javabean实现serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。
解决方案:在javabean对象中添加,private static final long serialVersionUID;
runtimeService对象可以设置流程变量和获取流程变量。
taskService对象可以设置流程变量和获取流程变量
流程实例启动的时候可以设置流程变量。
任务办理完成的时候可以设置流程变量。
流程变量可以通过名称/值的形式设置单个流程变量。
流程变量可以通过Map集合,同事设置多个流程变量。
Map集合的key表示流程变量的名称,value表示流程变量的值。
变量总结:
在流程执行或者任务执行的过程中,用于设置和获取变量,使用量程变量在流程传递的过程中传递业务参数。
act_ru_variable:正在执行的流程变量表。
act_hi_variable:流程变量历史表。
sertVariable:设置流程变量的时候,流程变量名称相同的时候,后一次的值替换前一次的值,而且可以看到task_id的字段不会存放任务ID的值。
setVariableLocal:设置流程变量的时候,针对当前活动的节点设置流程变量,若果一个流程中存在两个活动节点,针对每个活动节点都设置的流程变量,
即使流程变量的名称相同,后一次的版本的值也不会替换前一次版本的值,他会使用不同的任务ID作为标识,存放两个流程变量值,
而且可以看到task_id的字段会存放任务ID的值。
sertVariable和setVariableLocal的区别:使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为
正在执行的流程变量中没有这个数据),所以查询真在执行的任务时不能查询到我们需要的数据,此时需要查询历史流程变量。
临时变量不会持久化到数据库中。使用场景例如:任务节点后连线中变量参与计算 但是不用持久化到数据库中的数据。