Activiti7
一、工作流介绍
1.1 概念
工作流(Workflow),它是通过计算机管理业务流程的自动化。它主要解决了在多个参与者之间按照预定义的规则自动传递文档、信息或任务的过程,从而实现预期的业务目标的问题。
1.2 工作流系统
软件系统具有工作流的功能,我们称之为工作流系统,工作流的功能是什么?它是对系统的业务流程进行自动化管理,因此工作流是基于业务流程的,因此软件系统的核心基本上是系统的业务流程,工作流只是协助业务流程管理。即使没有工作流业务系统也可以开发运行,但有工作流可以更好地管理业务流程,提高系统的可扩展性。
1.3 适用行业
消费品行业、制造业、电信服务业、银证保险等金融服务业、物流服务业、物业服务业、物业管理、大中型进出口贸易公司、政府机构、研究所、教育服务业,特别是大型跨国企业和集团公司。
1.4 具体应用
1.关键业务流程:订单、报价处理、合同审核、客户电话处理、供应链管理等。
2、行政管理:出差申请、加班申请、休假申请、汽车申请、各种办公用品申请、购买申请、日报、周报等原手工流通处理的行政表格。
3、人事管理类:员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。
4、财务相关类别:付款请求、应收款处理、日常报销处理、出差报销、预算及计划申请等。
5.客户服务:客户信息管理、客户投诉、请求处理、售后服务管理等。
6.特殊服务:ISO工作流软件可自动规范地实施一系列通过表单逐步手动流通完成的相应流程、质量管理对应流程、产品数据信息管理、贸易公司报关处理、物流公司货物跟踪处理等任务。
1.5 实现方式
在没有特殊的工作流引擎之前,为了实现过程控制,我们通常使用状态字段的值来跟踪过程的变化。这样,没有角色的用户就可以通过状态字段的值来决定是否显示记录。
对于有权查看的记录,当前用户根据自己的角色决定审批是否合格。如果状态字段设置值,则表示合格;当然,如果不合格,也需要设置值来表示不合格。
这是最原始的方式。虽然流程控制是通过状态字段实现的,但当我们的流程发生变化时,也应调整此方法编写的代码。
那么,有没有专业的方法来管理工作流程呢?在业务流程发生变化后,我们的程序不能改变。如果能达到这样的效果,我们的业务系统的适应性就会大大提高。
二、Activiti7概述
2.1 介绍
Alfresco201年5月17日,软件宣布Activiti业务流程管理(BPM)开源项目正式启动,首席架构师由业务流程管理BPM的专家 Tom Baeyens担任,Tom Baeyens就是原来jbpm的架构师,和jbpm当然,这是一个非常著名的工作流引擎activiti也是工作流引擎。
Activiti是工作流引擎, activiti可以提取业务系统中复杂的业务流程,并使用特殊的建模语言BPMN2.0定义业务流程按照预定义流程执行,实现系统流程activiti管理,减少业务系统因流程变更而进行系统升级改造的工作量,从而提高系统的健壮性,还降低了系统开发维护的成本。
官方网站:https://www.activiti.org/
经验版:
最新版本:Activiti7.0.0.Beta
2.1.1 BPM
BPM(Business Process Management),也就是说,业务流程管理是一个标准化的结构端到端业务流程,以不断提高组织业务效率。常见的商业管理教育,如EMBA、MBA等均将BPM包含在内。
2.1.2 BPM软件
BPM软件是根据企业业务环境的变化,促进人与人、人与系统、系统与系统的整合和调整的业务方法和解决方案IT工具。
通过BPM软件建模、自动化、管理监控和优化企业内外业务流程的整个生命周期,降低企业成本,大大提高利润。
BPM软件广泛应用于企业,任何有业务流程的地方都可以BPM企业人事办公管理、采购流程管理、公文审批流程管理、财务管理等软件管理。
2.1.3 BPMN
BPMN(Business Process Model AndNotation)- 业务流程模型和符号 是由BPMI(BusinessProcess Management Initiative)开发的一套标准的业务流程建模符号,使用BPMN提供的符号可以创建业务流程。
2004年5月发布了BPMN1.0规范.BPMI于2005年9月并入OMG(The Object Management Group对象管理组织)组织。OMG于2011年1月发布BPMN2.0的最终版本。
具体发展历史如下:
BPMN 是目前被各 BPM 厂家广泛接受 BPM 标准。Activiti 就是使用 BPMN 2.0 进行流程建模、流程执行管理,它包括很多的建模符号,比如:
Event
用一个圆圈来表示在运行过程中发生的事情。
圆角矩形表示个活动或多个活动组成
Bpmn图形实际上是通过的xml表示业务流程,以上.bpmn用文本编辑器打开文件:
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id="myProcess" name="My process" isExecutable="true"> <startEvent id="startevent1" name="Start"></startEvent> <userTask id="usertask1" name="创建请假单"></userTask> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow> <userTask id="usertask2" name="部门经理审核"></userTask> <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow> <userTask id="usertask3" name="人事复核"></userTask> <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow> <endEvent id="endevent1" name="End"></endEvent> <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess"> <bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess"> <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> <omgdc:Bounds height="35.0" width="35.0" x="130.0" y="160.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"> <omgdc:Bounds height="55.0" width="105.0" x="210.0" y="150.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"> <omgdc:Bounds height="55.0" width="105.0" x="360.0" y="150.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3"> <omgdc:Bounds height="55.0" width="105.0" x="510.0" y="150.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> <omgdc:Bounds height="35.0" width="35.0" x="660.0" y="160.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <omgdi:waypoint x="165.0" y="177.0"></omgdi:waypoint> <omgdi:waypoint x="210.0" y="177.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <omgdi:waypoint x="315.0" y="177.0"></omgdi:waypoint> <omgdi:waypoint x="360.0" y="177.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> <omgdi:waypoint x="465.0" y="177.0"></omgdi:waypoint> <omgdi:waypoint x="510.0" y="177.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"> <omgdi:waypoint x="615.0" y="177.0"></omgdi:waypoint> <omgdi:waypoint x="660.0" y="177.0"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
2.2 使用步骤
部署activiti
Activiti是一个工作流引擎(其实就是一堆jar包API),业务系统访问(操作)activiti的接口,就可以方便的操作流程相关数据,这样就可以把工作流环境与业务系统的环境集成在一起。
流程定义
使用activiti流程建模工具(activity-designer)定义业务流程(.bpmn文件) 。
.bpmn文件就是业务流程定义文件,通过xml定义业务流程。
流程定义部署
activiti部署业务流程定义(.bpmn文件)。
使用activiti提供的api把流程定义内容存储起来,在Activiti执行过程中可以查询定义的内容
Activiti执行把流程定义内容存储在数据库中
启动一个流程实例
流程实例也叫:ProcessInstance
启动一个流程实例表示开始一次业务流程的运行。
在员工请假流程定义部署完成后,如果张三要请假就可以启动一个流程实例,如果李四要请假也启动一个流程实例,两个流程的执行互相不影响。
用户查询待办任务(Task)
因为现在系统的业务流程已经交给activiti管理,通过activiti就可以查询当前流程执行到哪了,当前用户需要办理什么任务了,这些activiti帮我们管理了,而不需要开发人员自己编写在sql语句查询。
用户办理任务
用户查询待办任务后,就可以办理某个任务,如果这个任务办理完成还需要其它用户办理,比如采购单创建后由部门经理审核,这个过程也是由activiti帮我们完成了。
流程结束
当任务办理完成没有下一个任务结点了,这个流程实例就完成了。
三、Activiti环境
3.1 开发环境
Jdk1.8或以上版本
Mysql 5及以上的版本
Tomcat8.5
IDEA
3.2 Activiti环境
我们使用:Activiti7.0.0.Beta1 默认支持spring5
3.2.1 下载activiti7
Activiti下载地址:http://activiti.org/download.html ,Maven的依赖如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.0.0.Beta1</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
:
activiti运行需要有数据库的支持,支持的数据库有:h2, mysql, oracle, postgres, mssql, db2。
3.2.2 流程设计器IDEA下安装
在IDEA的File菜单中找到子菜单”Settings”,后面我们再选择左侧的“plugins”菜单,如下图所示:
此时我们就可以搜索到actiBPM插件,它就是Activiti Designer的IDEA版本,我们点击Install安装。
安装好后,页面如下:
提示需要重启idea,点击重启。
重启完成后,再次打开Settings 下的 Plugins(插件列表),点击右侧的Installed(已安装的插件),在列表中看到actiBPM,就说明已经安装成功了,如下图所示:
后面的课程里,我们会使用这个流程设计器进行Activiti的流程设计。
3.3 Activiti的数据库支持
Activiti 在运行时需要数据库的支持,使用25张表,把流程定义节点内容读取到数据库表中,以供后续使用。
3.3.1 Activiti 支持的数据库
activiti 支持的数据库和版本如下:
数据库类型 | 版本 | JDBC连接示例 | 说明 |
---|---|---|---|
h2 | 1.3.168 | jdbc:h2:tcp://localhost/activiti | 默认配置的数据库 |
mysql | 5.1.21 | jdbc:mysql://localhost:3306/activiti?autoReconnect=true | 使用 mysql-connector-java 驱动测试 |
oracle | 11.2.0.1.0 | jdbc:oracle:thin:@localhost:1521:xe | |
postgres | 8.1 | jdbc:postgresql://localhost:5432/activiti | |
db2 | DB2 10.1 using db2jcc4 | jdbc:db2://localhost:50000/activiti | |
mssql | 2008 using sqljdbc4 | jdbc:sqlserver://localhost:1433/activiti |
3.3.2 在MySQL生成表
3.3.2.1 创建数据库
创建 mysql 数据库 activiti (名字任意):
CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;
3.3.2.2 使用java代码生成表
1) 创建 java 工程
使用idea 创建 java 的maven工程,取名:activiti01。
2) 加入 maven 依赖的坐标(jar 包)
首先需要在 java 工程中加入 ProcessEngine 所需要的 jar 包,包括:
-
activiti-engine-7.0.0.beta1.jar
-
activiti 依赖的 jar 包: mybatis、 alf4j、 log4j 等
-
activiti 依赖的 spring 包
-
mysql数据库驱动
-
第三方数据连接池 dbcp
-
单元测试 Junit-4.12.jar
我们使用 maven 来实现项目的构建,所以应当导入这些 jar 所对应的坐标到 pom.xml 文件中。
完整的依赖内容如下:
<properties>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<activiti.version>7.0.0.Beta1</activiti.version>
</properties>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 模型处理 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 转换 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn json数据转换 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 布局 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- activiti 云支持 -->
<dependency>
<groupId>org.activiti.cloud</groupId>
<artifactId>activiti-cloud-services-api</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- 链接池 -->
<dependency>
<groupId>commons-dbcp</groupId>