- 部署流程定义
- 查看流程定义(获取所有流程定义的deploymentId)
- 删除流程定义(删除指定的deploymentId流程定义的信息)
- 查看流程图附件(查看指定的deploymentId流程定义的图片)
- 查询最新版本的流程定义
- 删除所有流程定义(根据key删除所有相同的不同版本的流程定义)
- 挂起或激活流程定义(根据ProcessDefinitionId)
- 总结(管理流程定义)
一、部署流程定义
图示:
说明:
1)先获取流程引擎对象:在创建时会自动加载classpath下的activiti.cfg.xml
2) 首先获得默认的流程引擎,通过流程引擎获取了一个RepositoryServive对象(仓库对象)
3)由仓库的服务对象产生一个部署对象配置对象,用来封装部署操作的相关配置
4)这是一个链式编程,在部署配置对象中设置显示名,上传流程定义规则文件
5)向数据库表中存放流程定义的规则信息
6)这一步在数据库中将操作三张表:
a)act_re_deployment(部署对象表)
存放流程定义的显示名和部署时间,每部署一次增加一条记录
b)act_re_procdef(流程定义表)
存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
注意:当流程定义的key相同的情况下,使用的是版本升级
c)act_ge_bytearray(资源文件表)
存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只
指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。
三种方式:
1. 分别添加.bpmn和.png文件
2. 流的方式添加一个zip包
3. 流的方式分别添加.bpmn文件和.png文件
1.1 一次加载一个文件
1.2 流方式加载zip包
1.3 流的方式一次加载一个文件
二、查看流程
图示:
代码片段:
可以看到流程定义的key值相同情况下,版本是从1开始逐次升级的
流程定义的Id是【key:版本:生成ID】
说明:
1)流程定义和部署对象相关的Service都是RepositoryService
2)创建流程定义查询对象,可以在ProcessDefinitionQuery上设置查询的相关参数
3)调用ProcessDefinitionQuery对象的list方法,执行查询,获得符合条件的流程定义列表
4)由运行结果可以看出:
Key和Name的值为:bpmn文件process节点的id和name的属性值
5)key属性被用来区别不同的流程定义
6)带有特定key的流程定义第一次部署时,version为1.之后每次部署都会在当前最高版本号上加1
7)Id的值的生成规则为:{processDefinitionKey}:{processDefinitionVersion}:{generated-id},这里的generated-id是一个自动生成的唯一的数字
8)重复部署一次,deploymentId的值以一定的形式变化
规则act_ge_property表生成
三、删除流程定义
图示:
代码片段:
说明:
1)因为删除的是流程定义,而流程定义的部署时属于仓库服务的,所有应该先得到RepositoryService
2)如果该流程定义下没有正在运行的流程,则可以用普通删除。如果是有关联的信息,用级联删除。
项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使用
四、查看流程图附件
图示:
代码片段:
说明:
1)deploymentId为流程部署ID
2)resourceName为act_ge_bytearray表中Name_列的值
3)使用repositoryService的getDeploymentResourceNames方法可以获取指定部署下得所有文件的名称
4)使用repositoryService的getResourceAsStream方法传入部署ID和资源图片名称可以获取部署下指定名称文件的输入流
5)最后的有关IO流的操作,使用FileUtils工具的copyInputStreamToFile方法完成流程到文件的拷贝,将资源文件以流的形式输出到指定文件夹下
五、查询最新版本的流程定义
图示:
代码片段:
六、
删除所有流程定义(根据key删除所有相同的不同版本的流程定义)
图示:
代码片段:
七、挂起或激活流程定义
图示:
流程定义挂起或激活的url:
http://localhost:8080/kft-activiti-demo-no-maven/workflow/processdefinition/update/suspend/leave:1:20
注意:
当流程定义激活或挂起时,对应的流程运行实例的suspended状态或跟着改变;
代码片段:
请注意suspendProcessDefinitionById和activateProcessDefinitionById方法的第二个参数,我们来看一下RepositoryServiceImpl中这个方法的定义:
原理它就是用来控制在挂起流程定义时,是否同时挂起对应的流程实例:
activateProcessDefinitionById调用层次类似,不重复
八、总结(管理流程定义)