工做流通常在OA系统用的比较多,固然,只要有流程审批的地方都会用到,activiti只是开源的工做流中比较流行的一个,还有其余的开源的工做流,这里学习activiti工做流;前面部分是关于activiti的整体的介绍及如何搭建,后半部分使用一个demo演示,清晰直观的观察工做流的工做机制及数据库表的数据变化,对工做流的理解和使用有一个直观的认识。java
Activiti是一个开源的工做流框架,用的最多的例子就是审批流程,好比员工请假,申请以后提交,而后会提交到经理,经理审批完可能还会部长审批,等一系列流程;还有好比报销申请,须要先由经理审批,而后由总监审批,最后还要财务审批等,通过一系列事先制定好的流程;固然了,这只是工做流的一个应用,实际工做流还有其余的不少应用;activiti使用起来也比较方便,自动生成25张数据库表,有8大核心API,经过这些核心API就能够很方便的使用工做流。mysql
不少将工做流的博客都比较老,并且都只从本身的一个部署方式去讲解,不一样的博客可能使用不一样的部署方式,让初学者感到很懵,不知道到底应该用哪一个,其实部署流程资源有不少种方法,包括classpath、InputStream、字符串、zip格式压缩包,不一样的部署方式能够根据项目或者本身实现的难易程度进行自由选择;git
由于支持直接加载.bpmn格式的文件,比较方便,而actiBPMN插件也正好能够很方便的生成.bpmn格式的文件,很方便的画流程图,因此这就是前面要先安装actiBPMN插件缘由,画出流程图以后,而后部署就好了,全部我使用直接加载.bpmn文件的方式部署,但愿初学者不要在这里疑惑。github
使用步骤:部署流程è发起一个流程实例(流程开始)è使用流程(查询流程、查询代办、提交审批、结束流程….等等)web
每次修改完流程图以后,都要从新部署流程;每开始一个(审批流程)新的流程实质就是发起一个流程实例;发起流程以后,整个流程就开始了。spring
数据库表比较多,这里就不都列举了,详情能够网上搜索,有很详细的说明;sql
须要主要关注的几张表:数据库
部署流程阶段:ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF浏览器
发起流程阶段:ACT_RU_EXECUTION、ACT_RU_TASK、ACT_RU_VARIABLEspringboot
一个流程实例的发起,在ACT_RU_EXECUTION中才存在,流程实例执行完毕,则该表的该实例信息就会被自动删除;
一个流程实例的发起,在ACT_RU_TASK才会有该流程实例的审批相关任务,该表只对应一个流程实例执行到的当前节点的审批信息,包括审批人和任务id等任务信息,能够根据审批人查询其代办任务,执行完以后便删除,而后显示下一审批节点的任务信息,即只显示当前节点的任务信息,这个流程实例执行完毕,则表为空;
一个流程实例的发起,到达一个节点,若是该节点有判断条件(在流程线上的判断条件),则判断条件中的变量会被存储到ACT_RU_VARIABLE,若是流程实例执行完毕,则该表为空。
RepositoryService 流程仓库Service,能够管理流程仓库例如部署删除读取流程资源
RuntimeService 运行时Service能够处理全部运行状态的流程实例流程控制(开始,暂停,挂起等)
TaskService 任务Service用于管理、查询任务,例如签收、办理、指派等
IdentitiServicec 身份Service能够管理查询用户、组之间的关系
FormService 表单Service用于读取和流程、任务相关的表单数据
HistoryService 历史Service用于查询全部的历史数据
ManagementService 引擎管理Service,和具体业务无关,主要查询引擎配置,数据库做业
DynamicBpmService 动态bpm服务
须要重点关注的三个主要API:
RepositoryService:流程仓储的管理,能够读取流程资源、部署、查询已部署的流程、删除等;(相似java的类)。
RuntimeService:流程实例的发起及流程实例的管理等;(相似java的类的实例)。
TaskService:流程实例中的任务管理,例如代办任务查询、办理、指派等;(相似java类的实例的方法和参数值)。
个人开发环境:
Idea(2019.3.3),springboot(2.2.7),activiti7,mybatis(2.1.2), druid(1.1.10);
idea的actiBPMN插件安装
插件官网:https://plugins.jetbrains.com/plugin/7429-actibpm/versions
下载完成以后,不用解压,建议放到idea安装目录的plugins下:
安装完成重启以后,选择新建,则能够看见bpmnfile,则说明成功了:
插件安装完成了,接下来就能够搭建demo了;
项目地址:https://github.com/Little-Orange7/activiti-demo
这是搭建springboot的步骤,后面的比较简单,就省略了。
来看下项目的依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
application.propertities配置:
#server server.port=8088 server.compression.enabled=true #datasource spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.username=root spring.datasource.password=root spring.datasource.url=jdbc:mysql://localhost:3306/cmms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true #activiti7默认是不自动生成8张历史记录表的,这里设置开启 #spring.activiti.db-history-used=true #spring.activiti.history-level=audit
遇到的问题:
1.启动报错,缘由是启动时没有自动建立activiti表,因此没有查询到相关表;
解决:在数据库链接池的url上加上:nullCatalogMeansCurrent=true
2.项目启动只建立了17张表,没有建立25张表,缘由是activiti7默认是不建立历史记录
表的(对整个工做流的执行没有影响,只是不会生成历史记录);
解决:若是要生成历史记录表,要主动打开,在配置中加入
spring.activiti.db-history-used=true spring.activiti.history-level=audit
3.activiti7默认整合了spring security,因此若是直接在浏览器中访问,是须要先登陆的;
解决:为了只测试activiti,这里能够先把spring security屏蔽掉,在启动类加上这个:
@SpringBootApplication(exclude = {//activiti7集成了springSecurity,此处暂时屏蔽掉 org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class })
这时候启动,不报错,查看数据库,能够看见已经生成了25张表,说明启动成功。
而后建立相应模块:
项目地址:https://github.com/Little-Orange7/activiti-demo
用拖拽方式建立一个流程图:
编辑流程图节点信息,assignee随意指定一个便可,流程启动后,能够按照这个assignee来查询该user的代办任务;
加入判断条件及判断变量:
环境准备及框架搭建已经完成,接下来就能够调用API来使用工做流;
部署流程:
查询已部署的所有流程:
发起一个流程:
查询代办任务(根据用户名):
提交任务(根据任务id):
下面将使用[我项目的demo](https://github.com/Little-Orange7/activiti-demo)来演示工做流如何使用及对应流程数据表的数据变化;
先模拟节点一审批赞成,节点二审批拒绝,观察数据库的数据变化;而后在模拟节点一审批赞成,节点二审批赞成,整个流程结束,观察数据库数据变化;
对应数据库表:
对应数据库表:
对应数据库表:
能够观察到流程在第一个审批节点。
审批赞成(message=Y)
提交任务以后,流程到了第二个审批节点
对应的判断条件的变量及值:
审批拒绝(message=N)
流程又回到节点一了
变量的值变为N
此时流程到了节点二
到此,此流程实例已经结束了;
任务表已经没有任务了:
流程实例执行表也没有实例了:
变量表也没有变量了:
以上流程执行完成,根据流程和数据的跟踪,能很清晰的观察到流程的执行过程,固然这里只是一个简单的流程演示,还有不少流程流转方式须要去学习,待之后更新,但愿这篇博客能帮助你学习activiti,若是有疑问的地方你们留言指出来一块儿学习探讨。