工作流一般在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,如果有疑问的地方大家留言指出来一起学习探讨。

activiti工作流入门学习的更多相关文章

  1. 工作流Activiti新手入门学习路线整理

    写在前面: 最近项目中使用到了工作流,虽然此部分不是自己需要完成的,但是也涉及到了要调用写的接口.正好有时间,就了解下,以便之后能在其他项目中用到时,不至于什么都不知道什么都不了解. 这里就主要整理下 ...

  2. Activiti工作流框架学习(一)之通用数据表详细介绍

    文/朱季谦 Activiti工作流引擎自带了一套数据库表,这里面有一个需要注意的地方: 低于5.6.4的MySQL版本不支持时间戳或毫秒级的日期.更糟糕的是,某些版本在尝试创建此类列时将引发异常,而其 ...

  3. Activiti 工作流入门指南

    概览 如我们的介绍部分所述,Activiti目前分为两大类: Activiti Core Activiti Cloud 如果你想上手Activiti的核心是否遵循了新的运行时API的入门指南:Acti ...

  4. Activiti工作流框架学习笔记(二)之springboot2.0整合工作流Activiti6.0

    以前在工作当中做过不少与工作流Activiti有关的工作,当时都是spring集成activiti5.22的项目,现在回过头去看,其实版本已经稍微老了,因此,基于先前的工作经验,决定用较新版本的技术来 ...

  5. Activiti工作流入门

    Activiti简介 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度. Activiti 作为一个遵从 Apache 许可的工 ...

  6. Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作

    可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种: Fatal  error  war ...

  7. Activiti工作流框架学习(一)——环境的搭建和数据表的了解

    一.什么是工作流 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现 ...

  8. activiti工作流引擎学习(三)

    5.接收任务活动(receiveTask,即等待活动)不是一个任务节点 接收任务是一个简单任务,他会等待回应消息的到达,当前,官方只实现了这个任务的java语义,当流程达到接受任务,流程状态会保存到数 ...

  9. Activiti工作流引擎学习(一)

    1.部署对象和流程定义相关表:RepositoryService act_re_deployment: 部署对象表:一次部署的多个文件的信息,对于不需要的流程可以删除和修改 act_re_procde ...

随机推荐

  1. 图解AVL树

    1:AVL树简介 二叉搜索树在一般情况下其搜索的时间复杂度为O(logn),但某些特殊情况下会退化为链表,导致树的高度变大且搜索的时间复杂度变为O(n),发挥不出树这种数据结构的优势,因此平衡二叉树便 ...

  2. 44道JavaScript送命题

    很久以前看过一个老外写的帖子,JavaScript Puzzlers!,直译就是JavaScript难题,里面列举了100道JavaScript选择题,大部分都是让人摸不着头脑的题目,需要仔细琢磨一番 ...

  3. thinkphp5.0 配置文件加载路径说明

    在thinphp5.0框架里,js,css等配置文件都是加载在/public/static的目录下,所以要引用这些文件,路径必须是要写好的,代码如图: return [ // 默认模块名 'defau ...

  4. $_FILES上传错误类型

    $_FILES['file']['error']其值为 0,没有错误发生,文件上传成功. 其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值. 其值 ...

  5. php header() 常用content-type

    //定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Content-type: application/at ...

  6. 获取 ProgramData 之类的环境变量(文件夹路径)的值

    GetEnvironmentVariable Recognized Environment Variables https://docs.microsoft.com/en-us/windows/dep ...

  7. Django入门3:视图views

    1.获取用户请求数据 1.1 request.GET 获取request.method='GET'的数据 request.GET.get('name',None) 1.2 request.POST 获 ...

  8. UVA10599:Robots(II)(最长上升子序列)

    Your company provides robots that can be used to pick up litter from fields after sporting events an ...

  9. zabbix3.x.x升级教程

    1:停掉正在运行的zabbix服务,确保没有新数据写入数据库. /etc/init.d/zabbix_server stop 2:备份原zabbix的数据库数据,以及相关文件. mysqldump - ...

  10. CentOS 6.5下通过yum安装MongoDB记录

    安装MongoDB 1.创建repo vi /etc/yum.repos.d/mongodb-org-3.6.repo   [mongodb-org-3.6]   name=MongoDB Repos ...