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 地址:

https://github.com/Caesarthegreat/Spring-activiti-demo.git

posted @ 2020-05-20 11:03  Caesar_the_great  阅读(2271)  评论(0编辑  收藏  举报