Spring activiti 入门教程 详细分析
ref: https://blog.csdn.net/ryuenkyo/article/details/83008641
ref: https://blog.csdn.net/clk_esunny/article/details/80336073
1 Activiti介绍
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务。
流程图。
2 BPMN
业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)
3 有什么用 - 为什么要用
很简单,基本上所有的所谓框架,都是基于某个问题,提出的一套解决方案,给你提供一组API,你调就行了。Activiti把表都给你建了,它不香吗?
4 怎么用 - 相关基础知识
1) 5种数据库表
Activiti的后台是有数据库的支持,工程一启动自动建表,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应,不同的表存放不同方面的数据,有流程定义表、任务结点表、流程变量表、任务历史表等等。
ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。
ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例,变量,任务等等。
ACT_GE_*: 通用数据,用于不同场景下,如存放资源文件。
23张表:
2) 5项Service
不同的Service类对应不同的功能。
RepositoryService 管理流程定义
RuntimeService 执行管理,包括启动、推进、删除流程实例等操作
TaskService 任务管理,是activiti的任务服务类。可以从这个类中获取任务的信息。
HistoryService 历史管理(执行完的数据的管理) ,是activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息
IdentityService 组织机构管理
3) 7项基本操作
设计流程图(各种组件,如连线、用户任务、网关)
流程定义增删改查
流程变量增删改查
启动流程定义
任务增删改查
完成任务
历史信息查询
5 工作流程
第一步:流程定义&部署
定义一个新的流程(如:请假流程,外出流程),在eclipse 或IDEA里面安装bpmn插件,画一个bpmn流程图。重启工程,activiti就在act_re_procdef表中插入一条记录,即这个新加入的流程。
一个请假的bpmn流程图如下:
为什么要画这个流程图?
说明:流程定义文档有两部分组成:
1) bpmn文件
流程规则文件。在部署后,每次系统启动时都会被解析,把内容封装成流程定义放入项目缓存中。Activiti框架结合这个xml文件自动管理流程,流程的执行就是按照bpmn文件定义的规则执行的,bpmn文件是给计算机执行用的。 解析.bpmn后得到的流程定义规则的信息,工作流系统就是按照流程定义的规则执行的。
2) 展示流程图的图片
在系统里需要展示流程的进展图片,图片是给用户看的。activiti通过这个图可以追踪到当前流程走到哪一步了(这是工作流软件基本的业务需求)。
在审批过程中的请假流程,如下图(当前走到人事审批这一步):
第二步:启动流程
这一步是需要开发者来实现的,拿我们日常请假来说,每当你提交了一个请假的申请,就会触发activiti流程控制的相关业务,拿上图的请假流程来说,当你提交一个申请,activiti就自动把流程推进到 部门领导审批 这一步。
相关代码:
1 public ProcessInstance startWorkflow(GooutApply apply, String userid, Map<String, Object> variables) {
2 apply.setApply_time(new Date().toString());
3 apply.setUser_id(userid);
4 gooutmapper.save(apply);
5 String businesskey=String.valueOf(apply.getId());//使用leaveapply表的主键作为businesskey,连接业务数据和流程数据
6 identityservice.setAuthenticatedUserId(userid);
7 // 第一个参数:bpmn流程图的key 第二个参数:业务类的主键
8 ProcessInstance instance=runtimeservice.startProcessInstanceByKey("goout",businesskey,variables);
9 System.out.println(businesskey);
10 String instanceid=instance.getId();
11 apply.setProcess_instance_id(instanceid);
12 gooutmapper.updateByPrimaryKey(apply);
13 return instance;
14 }
核心代码:runtimeservice.startProcessInstanceByKey("goout",businesskey,variables);
第一个参数:bpmn流程图的key 第二个参数:业务类的主键,activiti通过这个方法把业务(leaveapply)和流程(流程图的key - act_re_procdef)关联起来
runtimeservice是activiti的内部对象,直接注入就可用
这一步,在DB层面插入了相关表:act_ru_execution act_ru_task
act_hi_procinst act_hi_actinst act_hi_taskinst等
第三步:流式审批
不同角色的人依次登录系统,看到并审批和自己角色对应的待办任务,直到整个流程走完。主要更新表act_ru_task。A在审批前能看到记录,审批完就看不见了,因为流程已经走到了下一个人那里。
第四步:查看执行结果
审批发起人可以看到自己的审批到底走到哪个阶段了(红色框和红色箭头标记),即整个流程的审批情况。
6 相关问题
1) 如何画bpmn图?
推荐用eclipse画,idea对bpmn的支持不友好。
第一步:安装bpmn插件
在Eclipse的菜单中打开help -> install new software:
单击add:
Name: Activiti BPMN 2.0 designer
Location: http://activiti.org/designer/update/
第二步:拖拽组件,画图
第三步:配置组件属性
当前bpmn图的属性:
Task的属性:
Candidate group属性:这个属性很关键,代表哪个角色可以看到当前的task。
gateway的配置:
下图的Condition属性很重要,是用来控制流程走向的条件,即当deptleaderapprove_goout(在完成任务时,通过map传值)为true时,从部门领导审批走到人事审批。
审批时写的同意 & 拒绝存进act_ru/hi_variable,在画bpmn图时,根据act_ru/hi_variable中的值和bpmn图中的<sequenceFlow>匹配,决定画出的图是什么样子的
相关代码:
1 public MSG deptcomplete_goout(HttpSession session, @PathVariable("taskid") String taskid, HttpServletRequest req) {
2 String userid = (String) session.getAttribute("username");
3 Map<String, Object> variables = new HashMap<String, Object>();
4 // 审批意见:同意,拒绝
5 String approve = req.getParameter("deptleaderapprove_goout");
6 variables.put("deptleaderapprove_goout", approve);
7 taskservice.claim(taskid, userid);
8 // 提交审批
9 taskservice.complete(taskid, variables);
10 return new MSG("success");
11 }
7 源码git 地址: