工作流一般在OA系统用的比较多,当然,只要有流程审批的地方都会用到,activiti只是开源的工作流中比较流行的一个,还有其他的开源的工作流,这里学习activiti工作流;前面部分是关于activiti的总体的介绍及如何搭建,后半部分使用一个demo演示,清晰直观的观察工作流的工作机制及数据库表的数据变化,对工作流的理解和使用有一个直观的认识。
一.总体认识
1.介绍
Activiti是一个开源的工作流框架,用的最多的例子就是审批流程,比如员工请假,申请之后提交,然后会提交到经理,经理审批完可能还会部长审批,等一系列流程;还有比如报销申请,需要先由经理审批,然后由总监审批,最后还要财务审批等,经过一系列事先制定好的流程;当然了,这只是工作流的一个应用,实际工作流还有其他的很多应用;activiti使用起来也比较方便,自动生成25张数据库表,有8大核心API,通过这些核心API就可以很方便的使用工作流。
2.部署方式
很多讲工作流的博客都比较老,而且都只从自己的一个部署方式去讲解,不同的博客可能使用不同的部署方式,让初学者感到很懵,不知道到底应该用哪个,其实部署流程资源有很多种方法,包括classpath、InputStream、字符串、zip格式压缩包,不同的部署方式可以根据项目或者自己实现的难易程度进行自由选择;
因为支持直接加载.bpmn格式的文件,比较方便,而actiBPMN插件也正好可以很方便的生成.bpmn格式的文件,很方便的画流程图,所以这就是前面要先安装actiBPMN插件原因,画出流程图之后,然后部署就行了,所以我使用直接加载.bpmn文件的方式部署,希望初学者不要在这里疑惑。
3.使用
使用步骤:部署流程==>发起一个流程实例(流程开始)==>使用流程(查询流程、查询代办、提交审批、结束流程….等等)
每次修改完流程图之后,都要重新部署流程;每开始一个(审批流程)新的流程实质就是发起一个流程实例;发起流程之后,整个流程就开始了。
4.数据库表说明
数据库表比较多,这里就不都列举了,详情可以网上搜索,有很详细的说明;
需要主要关注的几张表:
部署流程阶段:ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF
发起流程阶段:ACT_RU_EXECUTION、ACT_RU_TASK、ACT_RU_VARIABLE
一个流程实例的发起,在ACT_RU_EXECUTION中才存在,流程实例执行完毕,则该表的该实例信息就会被自动删除;
一个流程实例的发起,在ACT_RU_TASK才会有该流程实例的审批相关任务,该表只对应一个流程实例执行到的当前节点的审批信息,包括审批人和任务id等任务信息,可以根据审批人查询其代办任务,执行完之后便删除,然后显示下一审批节点的任务信息,即只显示当前节点的任务信息,这个流程实例执行完毕,则表为空;
一个流程实例的发起,到达一个节点,如果该节点有判断条件(在流程线上的判断条件),则判断条件中的变量会被存储到ACT_RU_VARIABLE,如果流程实例执行完毕,则该表为空。
5.API说明
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插件安装
1.下载插件
插件官网:https://plugins.jetbrains.com/plugin/7429-actibpm/versions
下载完成之后,不用解压,建议放到idea安装目录的plugins下:
2.然后从本地安装插件,选择刚才那个插件包,安装完毕之后要重启idea才生效:
安装完成重启之后,选择新建,则可以看见bpmnfile,则说明成功了:
插件安装完成了,接下来就可以搭建demo了;
三.demo演示
项目地址:https://github.com/Little-Orange7/activiti-demo
1.搭建一个springboot项目
这是搭建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
2.然后使用actiBPMN插件在resource目录下新建bpmn文件:
用拖拽方式创建一个流程图:
编辑流程图节点信息,assignee随意指定一个即可,流程启动后,可以按照这个assignee来查询该user的代办任务;
加入判断条件及判断变量:
3.主要API的使用
环境准备及框架搭建已经完成,接下来就可以调用API来使用工作流;
部署流程:
查询已部署的全部流程:
发起一个流程:
查询代办任务(根据用户名):
提交任务(根据任务id):
4.模拟测试:
下面将使用[我项目的demo](https://github.com/Little-Orange7/activiti-demo)来演示工作流如何使用及对应流程数据表的数据变化;
先模拟节点一审批同意,节点二审批拒绝,观察数据库的数据变化;然后在模拟节点一审批同意,节点二审批同意,整个流程结束,观察数据库数据变化;
4.1部署流程
对应数据库表:
4.2发起流程
对应数据库表:
4.3根据用户查询代办任务
对应数据库表:
可以观察到流程在第一个审批节点。
4.4提交任务(第一个节点)
审批同意(message=Y)
提交任务之后,流程到了第二个审批节点
对应的判断条件的变量及值:
4.5提交任务(第二个节点)
审批拒绝(message=N)
流程又回到节点一了
变量的值变为N
4.6提交任务(节点一审批同意)
此时流程到了节点二
4.7提交任务(节点二审批同意)
到此,此流程实例已经结束了;
任务表已经没有任务了:
流程实例执行表也没有实例了:
变量表也没有变量了:
以上流程执行完成,根据流程和数据的跟踪,能很清晰的观察到流程的执行过程,当然这里只是一个简单的流程演示,还有很多流程流转方式需要去学习,待以后更新,希望这篇博客能帮助你学习activiti,如果有疑问的地方大家留言指出来一起学习探讨。