demo的搭建及使用
1、创建activiti审批流需要安装bpmn插件,新的idea版本支持的这个bpmn插件只有下图这个,并不好用,所以我这里使用eclipse来创建bpmn流程
eclipse的连接如下:链接:https://pan.baidu.com/s/1mSoKprN-TqcoGCG5CWBSTw?pwd=nb1o
这个eclipse已经安装了bpmn插件并且是绿色版的,下载即可使用
2、eclipse创建审批流程,在eclipse中新建activiti project项目,然后右击resource下的diagrams文件夹,new-->activiti diagram,即可创建bpmn文件
见下图,Start event指定流程的开始,End event指定流程的结束,Task指定流程的任务节点,Connection 这只节点之间的箭头(即流程的走向),除此之外还有网关等
(1)、鼠标点在流程面板的空白区域可以对整个流程进行编辑;
(2)、鼠标选中某个节点可以对节点进行编辑,对节点可以指定节点的操作人、候选人等,节点的候选人在后面会介绍到,操作人可以写死也可以通过el表达式指定;
(3)、鼠标选中某个箭头可以对箭头进行编辑,每个箭头就是一个分支,可以对分支指定条件,条件通过el表达式指定,比如下面的请假流程对 人事经理 发出的两个分支指定条件;
1、如果一个节点出来的多个分支,并且这些分支有多个为true,则流程会执行所有为true的分支,且每个分支都会产生一个后续任务;如以下人事经理审批 后 同时满足高级经理和大区经理两个分支条件,高级经理和大区经理审批后各自产生一条 总经理 任务,会有两个总经理任务;
2、如果一个节点出来的多个分支,并且这些分支全部为false,则会抛异常:流程无法继续执行,参考demo中的Test02中的test2流程模板;
3、流程创建好之后,保存,生成一个bpmn和png文件
如果没有生成png图片,在windows-->preferences中执行下面操作
4、在idea中创建activiti project 项目后,使用的activiti版本是7.0.0.Beta1,将3中创建的bpmn和png图片拷到项目中就可以使用这个流程创建流程定义和任务了
5、在idea中可以打开bpmn文件,可以看到就是xml文件,在代码中通过bpmn和png文件创建流程定义时会自动创建25张表,并且将bpmn文件解析保存到流程定义表中 ACT_RE_PROCDEF;
activiti的表说明,activiti的表全部是act开头的,然后是表示用途的两个字母
re:repository,表包含了流程定义和流程静态资源;
ru:runtime,运行时的表,包含流程实例,任务,变量,异步任务等。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除。 这样表数据可以一直很小速度很快。
hi:history,这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ge:general, 通用数据
activiti的功能介绍:
1、候选人:一个任务可以设置多个候选人,此时任务属于候选组任务而不属于某个候选人,候选人拾取任务后这个任务就属于候选人了,然后候选人可以操作这个任务了。候选人拾取任务后也可以归还任务,归还后的任务是组任务;参考代码中的Test06Group;
2,网关,网关也是用于节点之间数据流转的条件判断的,比 箭头的条件判断功能更强大,有以下几种网关:
(1)、排他网关ExclusiveGateway:当流程流转到排他网关,从排他网关出来的分支有多个为true时只会选择taskId最小的执行,从排他网关出来的分支全部为false时抛出异常;参考demo中的Test07Exclusive
(2)、并行网关ParallelGateway:从并行网关出来的所有分支都会执行,这些分支上如果有条件也会失效,这些分支都执行完成后再执行后面的流程;参考demo中的Test08ParallelGateway
(3)、包含网关InclusiveGateway:从包含网关出来的分支如果为true的都会执行,没有条件的分支也会执行,执行完之后再走后面的流程;参考demo中的Test09InclusiveGateway
(4)、事件网关EventGateway:根据事件判断流向, 具体怎么判断我也不清楚,找了一些资料也没有看到使用方法,有人知道怎么使用请在评论补充,非常感谢;
3、流程的挂起:可以对流程定义和流程实例进行挂起,挂起后的流程不能再被审批,参考demo中的Test02;
流程实例挂起更新ACT_RU_TASK、ACT_RU_EXECUTION 的 SUSPENSION_STATE_为2,流程定义挂起多更新一张表ACT_RE_PROCDEF,挂起后的流程可以激活,激活时更新SUSPENSION_STATE_为1;
使用demo:链接:https://pan.baidu.com/s/1NmTq2T9zap1x8eyP-mnc7g?pwd=bcye
demo中也包含了整合spring、springboot的代码
activiti执行sql的原理:
1、使用代码 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine() 创建 ProcessEngine对象的时候(默认读取resources目录下的 activiti.cfg.xml 文件)读取sql所在的xml文件,以sql的id作为key、操作数据库的其他信息封装成 MappedStatement 作为value,放入mappedStatements (Map对象)中,这段代码比较深
2、activiti的每个方法都会设置一个query,这个也是sql的id
3、后面执行sql的时候通过2中的query作为key,从1中的mappedStatements中获得MappedStatement 用于执行sql