因公司要求,将自己核实,全部踩坑过得资料写成文档,索性当做博客发出来,给其他朋友灵感以及自己以后回忆。
Activiti的大致流程:
- 使用bpmn生成流程定义图之后,
- 将会生成xml文件,
- activiti去读取xml,对数据库做操作(activiti会在数据库创建相关表)
- 流程实例、任务的执行(基础)
以下列流程图为例:
- 创建工作流引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
- 把工作流部署到工作流引擎上(即部署流程定义)
下面的例子是获取仓库服务,从类路径下完成部署
@Test
public void deploy() {
//部署工作流
//获取仓库服务
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()//创建一个部署的构建器
.addClasspathResource("processes/MyTask2.bpmn")//从类路径中添加资源,一次只能添加一个资源
.addClasspathResource("processes/MyTask2.png")//从类路径中添加资源,一次只能添加一个资源
.name("任务二")//设置部署的名称
.category("自动")//设置部署的类别
.deploy();
String deployId= deploy.getId();
System.out.println("部署的id:"+deployId);
System.out.println("部署的名称:"+deploy.getKey());
}
说明:
1) 先获取流程引擎对象:在创建时会自动加载classpath下的activiti.cfg.xml
2) 首先获得默认的流程引擎,通过流程引擎获取了一个RepositoryService对象(仓库对象)
3) 由仓库的服务对象产生一个部署对象配置对象,用来封装部署操作的相关配置。
4) 这是一个链式编程,在部署配置对象中设置显示名,上传流程定义规则文件
5) 向数据库表中存放流程定义的规则信息。
6) 这一步在数据库中将操作三张表:
Act_re_deployment(部署对象表):存放流程定义的显示名和部署时间,每部署一次增加一条记录 Act_re_procdef(流程定义表):存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
Act_ge_bytearray(资源文件表):存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。
Ps: 部署工作流还有多种方法,比如将bpmn与png打包成zip文件,然后部署时以io流形式部署发布。
- 执行工作流(启动流程实例)
@Test
public void startProcess(){
IdentityService identityService = processEngine.getIdentityService();//认证:保存组和用户信息
//指定执行我们刚才部署的工作流程
String processDefiKey="MyTask_2";
//取运行时服sh务
RuntimeService runtimeService = processEngine.getRuntimeService();
//取得流程实例 我们此处是用流程定义的key 来执行流程,除此之外也可以用流程定义的id来执行
ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey);
System.out.println("流程实例id:"+pi.getId());//流程实例id
System.out.println("流程定义id:"+pi.getProcessDefinitionId());//输出流程定义的id
}
说明:
1) 操作数据库的act_ru_execution表,如果是用户任务节点,同时也会在act_ru_task添加一条记录