Activiti工作流实战开发

Activiti工作流实战开发任务目标第一章:概念普及1.1、什么是工作流1.2、哪些行业需要工作流1.3、工作流系统的使用第二章:Activti的历史简介第三章:重要名字解释3.3、BPMN基础第四章:使用IntelliJ IDEA搭建Activti开发环境4.1、创建pom.xml文件配置环境所需要的依赖包4.2、Activiti的核心配置4.2.1、创建ProcessEngine引擎类4.2.2、读取activiti.cfg.xml配置文件4.2.3、关于ProcessEngineConfiguration构建ProcessEngine多种方式4.2.4、关于数据的配置参数说明4.3、Activiti所支持数据库类型4.4、Activiti创建的数据表4.5、创建一个Java类初始化Activiti的数据库第五章:Activiti整体结构图5.1、Service服务说明5.1.1、RepositoryService仓库服务5.1.2、运行时服务5.1.3、任务服务5.1.4、认证服务5.1.5、历史服务5.1.6、历史服务第六章:Process流程的定义和部署维护6.1、采用classpath方式6.2、采用InputStream流的方式6.3、在用zip压缩流的方式6.4、流程定义的删除6.5、查看流程定义6.6、流程定义文件的查询6.7、流程发布信息查询第七章:Activiti用户与用户组的关系7.1、表结构7.2、操作用户组和用户表7.3、用户与用户组关系第八章:Activiti流程实例和个人任务管理8.1、启动流程实例8.2、启动个人任务的三种方式PersonalTask第九章:Activiti集成Spring、Mybatis实现自定义表单9.1、配置pom.xml9.2、配置Activiti工作的引擎和数据库连接9.3、spring集成mybatis环境配置9.4、配置mybatis-config.xml9.5、绘制请假流程单9.6、初始化Activiti数据库操作9.7、具体业务逻辑管理类9.8编写请假单的实体类和service接口实现类9.9、mybatis接口以及mapper文件9.10、主键生成策略和核心测试类第十章:表单的介绍以及FormService使用10.1、获取动态表单的内容10.2、根据节点的信息获取form表单信息10.4、获取外置表单的信息第十一章:ServiceTask自动执行任务11.1、使用监听类实现java的服务任务11.2、使用Delegate expression来实现java的服务任务第十二章:MailTask邮件任务第十三章:ManualTask人工任务第十四章:ReceiveTask接收任务第十五章:指定任务组办理人第十六章:Activiti的网关(GateWay)设置16.1、排他网关16.2、并行网关16.3、包含网关第十七章:Activiti子流程第十八章:Activiti流程驳回、会签、挂起操作第十九章:Activiti 集成SpringBoot18.1、SpringBoot 集成第二十章:Activiti集成MockMVC单元测试第二十一章:Activiti REST API数据风格安装与认证课前默写作业面试题

任务

1. 工作流的基本理论
2. Activiti简介及BPMN
3. 使用IDEA搭建Activiti开发环境
4. Activiti的整体结构
5. Process流程定义和部署维护
6. Activiti用户和用户组
7. Activiti流程实例和个人任务管理
8. Activiti集成Spring、MyBatis实现自定义表单
9. 表单的介绍以及FormService的使用
10.ServiceTask自动执行任务
11.MailTask邮件任务
12.ManualTask人工任务
13.ReceiveTask接收任务
14.指定任务组办理人
15.Activiti网关设置
16.Activiti子流程
17.Activiti流程驳回、会签、挂起操作
18.Activiti集成SpringBoot
19.Activiti继承MockMVC单元测试
20.Activiti REST API数据风格的实现

目标

1. 掌握工作流的基本理论
2. 掌握Activiti简介及BPMN
3. 掌握使用IDEA搭建Activiti开发环境
4. 掌握Activiti的整体结构
5. 掌握Process流程定义和部署维护
6. 掌握Activiti用户和用户组
7. 掌握Activiti流程实例和个人任务管理
8. 掌握Activiti集成Spring、MyBatis实现自定义表单
9. 掌握表单的介绍以及FormService的使用
10.掌握ServiceTask自动执行任务
11.掌握MailTask邮件任务
12.掌握ManualTask人工任务
13.掌握ReceiveTask接收任务
14.掌握指定任务组办理人
15.掌握Activiti网关设置
16.掌握Activiti子流程
17.掌握Activiti流程驳回、会签、挂起操作
18.掌握Activiti集成SpringBoot
19.掌握Activiti继承MockMVC单元测试
20.掌握Activiti REST API数据风格的实现

1

第一章:概念普及

1.1、什么是工作流

工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。

工作流就是通过计算机技术对业务流程进行自动化管理。实现多个参与者按照预定的流程去自动执行业务流程。

1.2、哪些行业需要工作流

消费品行业,制造业,电信服务业,银证险等金融服务业,物流服务业,物业服务业,物业管理,大中型进出口贸易公司,政府事业机构,研究院所及教育服务业等,特别是大的跨国企业和集团公司。

总结一句话:凡是有组织机构的公司都有可能用到工作流。

1.3、工作流系统的使用
  1. 关键业务流程:订单、报价处理、采购处理、合同审核、客户电话处理、供应链管理等
  2. 行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等凡是原来手工流转处理的行政表单。
  3. 人事管理类:员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。
  4. 财务相关类:付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。
  1. 客户服务类:客户信息管理、客户投诉、请求处理、售后服务管理等。
  2. 特殊服务类:ISO系列对应流程、质量管理对应流程、产品数据信息管理、贸易公司报关处理、物流公司货物跟踪处理等各种通过表单逐步手工流转完成的任务均可应用工作流软件自动规范地实施。

第二章:Activti的历史简介

Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。

创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师Joram Barrez,一起加入到创建Alfresco这项首次实现Apache开源许可的BPMN 2.0引擎开发中来。

Activiti前身 是jbpm4,Activiti架构和jbpm4基本上是一样的。

架构师Tom Baeyens说:“ Activiti有非常大的影响力来改变目前BPM的生态。Activiti的Apache授权,完整的功能,将使Activiti到达一个新的水平。Activiti将推动业界的创新,因为BPM技术可以广泛而自由地被应用。通过实现这些想法以及开源社区的努力,也让Activiti成为事实上的 BPM和BPMN标准执行“。

第三章:重要名字解释

3.1、BPM

BPM,即业务流程管理,是一种以规范化的构造端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的的系统化方法,常见商业管理教育如EMBA、MBA等均将BPM包含在内。

3.2、BPMN

BPMN:业务流程建模与标注,包括这些图元如何组合成一个业务流程图(Business Process Diagram);讨论BPMN的各种的用途,包括以何种精度来影响一个流程图中的模型;BPMN作为一个标准的价值,以及BPMN未来发展的远景。

3.3、BPMN基础

业务流程图由一系列的图形化元素组成。这些元素简化了模型的开发,且业务分析者看上去非常熟悉。这些元素每个都有各自的特性,且与大多数的建模器类似。比如,活动是矩形,条件是菱形。应该强调的是:开发BPMN的动力就是为了在创建业务流程模型时提供一个简单的机制,同时又能够处理来自业务流程的复杂性。要处理这两个矛盾的需求的方法就是将标记的图形化方面组织分类为特定的类别。这里提供标记类别中的一小部分,以便业务流程图的读者可以简单地识别出元素的基本类型从而理解图形。以下是四种基本的类型:

1)流对象(Flow)

2)连接对象(Connection)

3)泳道(Swimlane)

4)人工信息(Artifact)

流对象:

一个业务流程图有三个流对象的核心元素。

这三种流对象是

事件---一个事件用圆圈来描述,表示一个业务流程期间发生的东西。事件影响流程的流动,一般有一个原因(触发器)或一个影响(结果)。基于它们对流程的影响,有三种事件:开始,中间以及终止事件

活动---一个活动用圆角矩形表示,是要处理工作的一般术语。一个活动可以是原子性的也可以是非原子性的(可以是由多个活动组合而成的更大粒度的活动)。活动的类型包括:任务和子流程。子流程在图形的下方中间外加一个小加号(+)来区分。

条件---条件用熟悉的菱形表示,用于控制序列流的分支与合并。另外,它还可以作为传统的选择,还包括路径的分支与合并。其内部的标记会给出控制流的类型。

连接对象:

连接对象将流对象连接起来形成一个业务流程的基本结构。提供此功能的三个连接对象是:

顺序流---顺序流用一个带实心箭头的实心线表示,用于指定活动执行的顺序。注意“控制流”这个术语一般不用于BPMN

消息流---消息流用一条带有开箭头的虚线表示,用于描述两个独立的业务参与者(业务实体或业务角色)之间发送和接受的消息流动。在BPMN中,用两个独立的池代表两个参与者。

关联---用一根带有线箭头的点线表示关联,用于将相关的数据、文本和其他人工信息与流对象联系起来。关联用于展示活动的输入和输出。

泳道

许多建模技术利用泳道这个概念将活动划分到不同的可视化类别中来描述由不同的参与者的责任与职责。BPMN支持2种主要的泳道构件。

---池描述流程中的一个参与者。可以看做是将一系列活动区别于其他池的一个图形容器,一般用于B2B的上下文中。

---道就是在池里面再细分,可以是垂直的也可以是水平的。道也是用于组织和分类活动。

人工信息:

人工信息添加到建模的业务流程上下文中作为信息备注,便于人员理解,当前BPMN规范的版本预定义了3种人工信息:

数据对象---数据对象是一个显示活动是如何需要或产生数据的。它们通过关联与活动连接起来。

---组用一个虚线的圆角矩形表示,用于记录或分析的目的,但不影响顺序流。

第四章:使用IntelliJ IDEA搭建Activti开发环境

我们可以在Activiti的官网上直接下载开发需要的相关jar包

指定官网地址:http://activiti.org/download.html

建议使用开发工具为eclipse和IntelliJ IDEA,所需的JDK为1.6+以上。

构建Activiti工程可以使用两种方式,一种是拷贝jar包,一种是使用maven的构建方式。

Activiti构建工程是依赖于spring的环境,故在下载的包中出现了Activiti-spring相关的jar包。

4.1、创建pom.xml文件配置环境所需要的依赖包
 
4.2、Activiti的核心配置
4.2.1、创建ProcessEngine引擎类

Activiti的工作流引擎类的配置主要是通过一个activiti.cfg.xml来配置完成的,我们可以通过以下方法获取ProcessEngine类的对象实例。

 

关于activiti.cfg.xml文件的配置路径,一般都是放在resource目录下,工程目录结构如下:

2

以下给出了两种配置 activiti.cfg.xml 文件的方式:

第一种方式:不带数据源DataSource

 

第二种方式:带有数据源DataSource

 
4.2.2、读取activiti.cfg.xml配置文件

虽然以上的配置都是有spring的配置属性,但是并不代表需要直接运行在spring的环境中。

 

或者直接通过纯java代码来构建ProcessEngine流程引擎的类。

 
4.2.3、关于ProcessEngineConfiguration构建ProcessEngine多种方式
4.2.4、关于数据的配置参数说明

配置Activiti引擎将使用的数据库有两种方法。第一个选项是定义数据库的JDBC属性:

基于提供的JDBC属性构建的数据源将具有默认的MyBatis连接池设置。可以选择将以下属性设置为调整该连接池(取自MyBatis文档):

示例数据库配置:

 

或者,javax.sql.DataSource可以使用实现(例如Apache Commons的 DBCP ):

 

其中,在processEngineConfiguration配置属性中有三种情况:

databaseSchemaUpdate:允许在进程引擎启动和关闭时设置策略来处理数据库模式。

4.3、Activiti所支持数据库类型
Activiti database typeExample JDBC URLNotes
h2jdbc:h2:tcp://localhost/activitiDefault configured database
mysqljdbc:mysql://localhost:3306/activiti?autoReconnect=trueTested using mysql-connector-java database driver
oraclejdbc:oracle:thin:@localhost:1521:xe
postgresjdbc:postgresql://localhost:5432/activiti
db2jdbc:db2://localhost:50000/activiti
mssqljdbc:sqlserver://localhost:1433;databaseName=activiti (jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver) OR jdbc:jtds:sqlserver://localhost:1433/activiti (jdbc.driver=net.sourceforge.jtds.jdbc.Driver)Tested using Microsoft JDBC Driver 4.0 (sqljdbc4.jar) and JTDS Driver
4.4、Activiti创建的数据表

Activiti一共有23张表其中所有的表都是以ACT_.*开始的。

4.5、创建一个Java类初始化Activiti的数据库
 

第五章:Activiti整体结构图

1、流程引擎是整个activiti的核心,所有的service都需要通过流程引擎来获得。

2、流程引擎会在创建的时候检查数据库表是否存在,如果不存在则会跑出异常,若要让引擎自动建表,则需要在配置文件添加。

3、activiti支持链式编程。

api.services

5.1、Service服务说明
5.1.1、RepositoryService仓库服务

仓库服务是存储相关的服务,一般用来部署流程文件,获取流程文件,查询流程定义信息等操作,是引擎中的一个重要的服务。

 
5.1.2、运行时服务

流程运行时的流程实例,流程定义,流程版本,流程节点等信息,使用运行时服务操作,是引擎中的一个重要的服务

 
5.1.3、任务服务

流程运行时的会产生任务,接收、办理、完成等操作使用任务服务完成,是引擎中的一个重要的服务

 
5.1.4、认证服务

流程运行过程中的一些用户信息,组信息等操作使用认证服务,但是认证服务一般只作为辅助,每一个系统都有一个比较完整的人员系统

 
5.1.5、历史服务

流程运行时,和运行完成之后的一些历史信息,包括历史任务,历史节点等,是引擎中的一个重要的服务

 
5.1.6、历史服务

流程运行时的任务表单信息,是引擎中的一个辅助的服务

 

第六章:Process流程的定义和部署维护

本章节我们主要讲解Activiti中流程的相关内容,包括流程的部署、查看、删除和修改等操作。

流程定义文件:一般扩展名为bpmn。

流程定义的图片:采用BPMN2.0规范的各种图形描绘,生成的是png图片格式。

下面我们来给大家介绍流程部署的三种方式:

6.1、采用classpath方式
 
6.2、采用InputStream流的方式

使用InputStream方式部署流程文件需要传入一个输入流的资源名称,输入流的来源是不受限制的,可以从classpath中读取,也可以从一个绝对路径文件中读取,也可以从网络上获取。

 
6.3、在用zip压缩流的方式

以上都是部署的是单个流程文件,如果在实际开发中要部署多个流程文件,我们可以将多个文件压缩成.zip格式,进行部署。

 

部署流程文件的时候一般都会操作以下三张表:

a) act_re_deployment

     存放流程定义的显示名和部署时间,每部署一次增加一条记录

b) act_re_procdef

     存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。

c) act_ge_bytearray

     存储流程定义相关的部署信息。即流程定义文档的存放地。

6.4、流程定义的删除

如果我们要删除流程定义的部署,实际上是属于仓库服务,所有我们要先得到RepositoryService对象,

如果该流程定义下没有正常运行的流程,则可以用普通删除,如果有关联信息,则用级联删除,一般删除操作的权限都是有超级管理员来完成的。

 
6.5、查看流程定义
 
6.6、流程定义文件的查询

流程定义部署的功能一班是由开发人员登录业务系统,进行部署的,部署的文件为bpmn文件或者是压缩文件,开发人员是可以查询该文件的,但是对于一般用户只需要查看部署之后生成的png图片即可。

 
6.7、流程发布信息查询

流程发布信息主要是管理流程发布的一些信息,包括发布名称、ID、发布时间、类别、赋值ID等信息。

 

第七章:Activiti用户与用户组的关系

在Activiti中默认建立了用户表,通过用户表可以构建简单的的用户管理功能。下面我们来看看Activiti给我们提供的四张关于用户和组的表。

7.1、表结构

3

1、从表的名字可以看出来,activiti其实提供了一个简单的用户表结构,用户组与用户之间通过映射表进行关联,用户信息是一个单独的表。

2、如果要扩展成权限表,只需要增加一个权限表,然后和用户表进行映射,或者和用户组进行映射,即可成为一个简单的权限管理结构表。

3、用户体系表和activiti的其他表没有外键关联,说明acitivi允许你使用自己创建的用户体系表,这样可以和spring security或者shiro容易的结合在一起。

7.2、操作用户组和用户表

1、创建用户组

 

2、保存删除用户组

 

3、查询用户组

 

4、添加、保存、删除用户

 

5、验证用户登录信息

 

6、设置用户信息表以及相关查询

 
7.3、用户与用户组关系

1、设置用户和用户组关系

 

2、查询用户与用户组关系

 

第八章:Activiti流程实例和个人任务管理

8.1、启动流程实例

我们必须要先启动一个流程的实例processInstance,Activiti才能去管理控制整个业务流程。

流程实例(ProcessInstance)和流程定义(ProcessDefinition)的关系,有点像类和实例对象的关系,ProcessDefinition是指整个流程步骤的说明,而ProcessInstance是指流程定义从开始到执行结束的过程。

执行对象(Execution)

在学习流程实例的过程中,提到一个执行对象Execution,Execution是按照ProcessDefinition的规则执行的当前路线,如果

ProcessDefinition只有一个执行路线的话,也就是我们俗称串行执行路线,那么Execution和ProcessInstance就是一一对应关系,如果一个ProcessDefinition中有多个执行路线的话,Execution和ProcessInstance可能是同一个也可能不是同一个。所以得出结论:一个流程中ProcessInstance有且只能有一个,而Execution可以存在多个。

运行结果:

流程实例ID:10001
流程定义ID:myProcess_1:1:4

​ 1)在数据库的act_ru_execution正在执行的执行对象表中插入一条记录

​ 2)在数据库的act_hi_procinst程实例的历史表中插入一条记录

​ 3)在数据库的act_hi_actinst活动节点的历史表中插入一条记录

​ 4)我们图中节点都是任务节点,所以同时也会在act_ru_task流程实例的历史表添加一条记录

​ 5)在数据库的act_hi_taskinst任务历史表中也插入一条记录。

 
8.2、启动个人任务的三种方式PersonalTask

个人任务PersonalTask指的是操作的任务,个人任务是当前节点的执行者。

BPMN流程图

4

第一种:直接指定办理人

在流程图中直接配置任务节点,指定办理人为“王小明”,这个中方式仅仅限于测试代码使用,实际开发中并不常用。

5

测试代码

1、发布流程

 

2、启动流程

 

3、查看我的个人待办事宜

 

4、完成我的个人待办事宜

 

第二种:使用Java EE6规范的UEL表达式

UEL是Java EE6规范的一部分,UEL(Unified Expression Language) 即统一的表达式语言,Activiti支持两种UEL表达式:UEL-VALUE、UEL-METHOD方式。

使用步骤:

  1. 在任务的节点,不直接指定处理人的ID,设置处理人的表达式为${assignee}
  2. 在启动一个流程实例的时候设置启动动态的变量的assignee的值
  3. 在程序执行过程中,使用UEL表达式获取指定的办理人

BPMN流程图

6

代码演示

 

使用POJO类

启动的流程时候的参数的value,不仅仅可以是String类型,还可以是Object对象(序列化的),Map,List,Array

我们这里采用对象做演示,执行步骤如下

1、设置流程的第一个节点动态的值为${user.userId},他会默认查找变量name为user的对应的值的getUserId获取值,重新部署流程定义

2、启动流程时,设置这个user的javabean到流程的全局变量中

3、查看走到这个节点的当前任务的处理人是否是我们user的userId变量的值

4、设置节点UEL表达式:${user.userID}

代码演示

 

启动流程

 

使用UEL-METHOD

执行步骤

1、设置节点的执行人为${method.getUserNameByUserId(userId)} ,其中method方法是我们注入到spring中的一个类,userId是我们设置的全局变量

2、将method方法注入到activiti的processEngineConfiguration的bean中(在我们的activiti.cfg.xml中)

3、启动一个流程设置全局变量userId作为启动参数,看看是否走到这个节点的处理人是我们method方法getUserNameByUserId返回的name

代码演示

 

activiti-cfg.xml配置

 

第三种:使用监听器TaskListenerImpl 来设置任务办理人

BPMN图

7

核心代码

 
 

第九章:Activiti集成Spring、Mybatis实现自定义表单

工程结构图:

8

9.1、配置pom.xml
 
9.2、配置Activiti工作的引擎和数据库连接
 
9.3、spring集成mybatis环境配置
 
9.4、配置mybatis-config.xml
 
9.5、绘制请假流程单

9

9.6、初始化Activiti数据库操作
 
9.7、具体业务逻辑管理类
 
9.8编写请假单的实体类和service接口实现类

Leave请假单:

 

LeaveService类

主要是实现对请假单的CRUD功能

 

LeaveServiceImp实现类

 
9.9、mybatis接口以及mapper文件

MyBatis接口定义

 

Mapper XML文件定义

 
9.10、主键生成策略和核心测试类

UUID生成策略

 

核心测试类ProcessManager

 

第十章:表单的介绍以及FormService使用

本章节主要讲解FormService的使用,以及Activiti不同的表单类型的应用。

在Activiti中一共有三种表单,动态表单、普通表单和外置表单。

10.1、获取动态表单的内容

如何获取在流程定义中表单的内容,Activiti提供了FormService的相关API获取流程启动节点的表单内容以及任务节点的表单内容。

RuntimeService提供了很多启动流程的API,命名规则请参考官网,都是以startProcessInstanceByXX方式来启动的,在启动中可以方式流程变量、指定businessKey等。

同样FormService也提供了启动流程的方法:

 

从以上的方法中可以看出来,启动流程是根据processDefinitionId来启动的。

测试代码

 
10.2、根据节点的信息获取form表单信息
 
10.4、获取外置表单的信息

第十一章:ServiceTask自动执行任务

在Activiti执行待办任务中,有一些任务是自动执行的操作,在这个节点上不需要任何的人工干预,从而实现自动化操作。

当前一个办理人办理完节点之后,然后下一个节点就自动马上执行。ServiceTask能实现这个功能。

11.1、使用监听类实现java的服务任务

BPMN图

10

定义自动执行的类

 

执行流程

 
11.2、使用Delegate expression来实现java的服务任务

BPMN流程图

11

${delegate}表示存放流程中的变量,该变量是一个java对象,来实现对应的服务。

辅助自动执行类

 

执行流程

 

第十二章:MailTask邮件任务

Activiti允许通过一个或者多个收件人发送电子邮件的自动邮件服务任务来增强业务流程,包括CC、BCC、简单的HTML内容等,值得注意的是邮件任务不是BPMN2.0官方任务规范,因此,在Activiti邮件任务作为一个专门的服务任务来实现的。并且该节点是自动执行的。

邮件服务器的配置一

activiti引擎要通过支持SMTP功能的外部邮件服务器发送邮件(gevhfepsbjgwbjfc)。 为了实际发送邮件,引擎穾知道如何访问邮件服务器。 下面的配置可以设置到activiti.cfg.xml配置文件中:

PropertyRequired?Description
mailServerHostnoThe hostname of your mail server (e.g. mail.mycorp.com). Default is localhost
mailServerPortyes, if not on the default portThe port for SMTP traffic on the mail server. The default is 25
mailServerDefaultFromnoThe default e-mail address of the sender of e-mails, when none is provided by the user. By default this is activiti@activiti.org
mailServerUsernameif applicable for your serverSome mail servers require credentials for sending e-mail. By default not set.
mailServerPasswordif applicable for your serverSome mail servers require credentials for sending e-mail. By default not set.
mailServerUseSSLif applicable for your serverSome mail servers require ssl communication. By default set to false.
mailServerUseTLSif applicable for your serverSome mail servers (for instance gmail) require TLS communication. By default set to false.

邮件服务器配置二

PropertyRequired?Description
toyesThe recipients if the e-mail. Multiple recipients are defined in a comma-separated list
fromnoThe sender e-mail address. If not provided, the default configured from address is used.
subjectnoThe subject of the e-mail.
ccnoThe cc’s of the e-mail. Multiple recipients are defined in a comma-separated list
bccnoThe bcc’s of the e-mail. Multiple recipients are defined in a comma-separated list
charsetnoAllows to change the charset of the email, which is necessary for many non-English languages.
htmlnoA piece of HTML that is the content of the e-mail.
textnoThe content of the e-mail, in case one needs to send plain none-rich e-mails. Can be used in combination with html, for e-mail clients that don’t support rich content. The client will then fall back to this text-only alternative.
htmlVarnoThe name of a process variable that holds the HTML that is the content of the e-mail. The key difference between this and html is that this content will have expressions replaced before being sent by the mail task.
textVarnoThe name of a process variable that holds the plain text content of the e-mail. The key difference between this and html is that this content will have expressions replaced before being sent by the mail task.
ignoreExceptionnoWhether an failure when handling the e-mail throws an ActivitiException. By default this is set to false.
exceptionVariableNamenoWhen email handling does not throw an exception since ignoreException = true a variable with the given name is used to hold a failure message

配置BPMN流程图

12

在activiti.cfg.xml文件中需要配置指定的邮件服务器

 

备注:其中mailServerPassword密码是通过QQ邮箱设置POP3服务,QQ邮箱默认是不开启的,通过手机发送短信到指定的QQ收信地址如图所示:

13

核心代码展示

 

启动流程并自动发送邮件

 

第十三章:ManualTask人工任务

第十四章:ReceiveTask接收任务

第十五章:指定任务组办理人

candidate-user是给某一个组的成员分配任务,candidate-user参数要求值的格式是多个字符串,中间以逗号分隔开。

当某一个流程传到该task对象时候,Activiti同样会创建一条task记录,但是与assignee不同的是,它并不属于某一个用户的task,而是属于在candidate-user属性中定义的所有参与者共同的任务,因此,在代码中需要执行taskService.createTaskQuery()查找到组的办理任务,只需要指定组中的任意一个成员办理了该任务,Activiti都会直接删除该记录,其他组员再也查不到该task记录了。

具体步骤如下:

  1. 给任务设置候选人(多个候选人,中间使用逗号分隔开),这里需要注意的是候选人是无法办理任务的。
  2. 候选人都可以查询到任务组。
  3. 候选人拾取(claim)组任务。
  4. 候选人拾取任务之后,该候选人变成任务的执行人。
  5. 执行完毕之后,Activiti直接删除该记录,其他组员查询不到该记录了。

BMPN流程图

14

核心代码展示

 

设置用户组办理任务

指定用户组,并添加该用户组下的对应用户

 

BPMN流程图

15

测试代码展示

分别使用不同用户组的人进行查询,结果如下:

 

??动态任务权限的设置 需要重新弄

第十六章:Activiti的网关(GateWay)设置

16.1、排他网关

排他网关,主要是在流程实例中实现决策,当流程执行到这个网关的时候,分支上需要设置condition条件,所有分支都会判断条件是否为true,如果条件为true,则执行该分支, 注意:排他网关只会选择一个为true的分支执行

如果分支的条件都不满足,没有经过排他网关,Activiti会抛出异常。

排他网关有点像Java中的if … else if… 每一个分支上可以指定一个条件。

BPMN流程图

16

测试代码展示

 
16.2、并行网关

并行网关,包括分支和汇聚两个节点,他允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出的顺序流:

注意:如果同一个并行的网关有多个进入和多个外出顺序流,他就同时具有分支和汇聚功能,这个时候,网关会先汇聚所有进入的顺序流,然后在切分成多个并行的分支。

需要强调的是:

并行网关一定是成对出现的,有分支必然有汇聚,一个分支执行完毕后,需要等待其他分支全部执行完流程才会走到下一个节点。

BPMN流程图

17

代码展示

 
16.3、包含网关

包含网关是看做排他网关和并行网关的结合体,和排他网关一样,我们能够在外出顺序流上定义条件,包含网关会解析他们,和排他网关的区别是能够选择多于一条的顺序流,这个和并行网关一样。

包含网关的功能是基于进入和外出顺序流的:

注意,假设同一个包括节点拥有多个进入和外出顺序流。 它就会同一时候含有分支和汇聚功能。包含网关是判断条件的。

这时,网关会先汇聚全部拥有流程token的进入顺序流。 再依据条件推断结果为true的外出顺序流,为它们生成多条并行分支。

BPMN流程图

18

测试代码展示

 

第十七章:Activiti子流程

第十八章:Activiti流程驳回、会签、挂起操作

第十九章:Activiti 集成SpringBoot

Activiti是Apache授权的业务流程管理(BPM)引擎。这样的引擎有一个核心目标,就是将人工任务和服务调用组成一个流程定义,并以一定的顺序执行这些定义,同时公开各种API来启动,管理和查询关于该定义的流程实例的数据。与许多竞争对手相反,Activiti是轻量级的,可以轻松地与任何Java技术或项目集成。所有这一切,以及任何规模的工作 - 从几十到几千甚至几百万的流程执行。

18.1、SpringBoot 集成

Activiti和Spring很好地结合在一起。Spring Boot中的convention-over-configuration方法与Activiti的流程引擎很好地配合使用。我们只需要一个数据库,SpringBoot会自动帮我们配置完成所需的各种service,并且实例化。

SpringBoot是基于“习惯优于配置”的原则,主要是为大量第三方的开源库提供了自动配置的功能,SpringBoot主要是由spring-boot-starters给Activiti提供了配置。

主要是配置如下:

  1. 自动创建Activiti ProcessEngine的实体bean
  2. 自动注册所有的Activiti Service 实体bean
  3. 创建一个Spring Job Executor
  4. 自动扫描部署在resource下的所有流程文件

导入pom.xml文件

 

配置application.properties文件

 

BPMN流程文件

19

定义流程Process接口

 

定义流程Process接口实现类

 

定义我的待办事宜接口以及实现类

 
 

SpringBoot 测试结果

 

第二十章:Activiti集成MockMVC单元测试

第二十一章:Activiti REST API数据风格

通用Activiti REST原则

安装与认证

activiti包含了一个activiti引擎的REST API,把activiti-rest.war部署到像Apache Tomcat这样的servlet容器就可以使用。不过,它也可以使用在其他web应用中,把activiti-rest的依赖都加入classpath,添加servlet,并映射到你的应用中。

默认情况下,activiti引擎会连接内存数据库H2。你可以修改WEB-INF/classes目录下的db.properties来修改数据库设置。REST API使用JSON格式(http://www.json.org),它是基于Restlet(http://www.restlet.org)开发的。

前端适合使用easyUI或者VUE.JS来展示

课前默写

1. 使用CXF发布SOAP协议的服务
2. Spring中整合CXF发布服务
3. 使用Spring整合CXF发布REST服务

作业

 

面试题

1. 工作流的基本理论
2. Activiti简介及BPMN
3. 使用IDEA搭建Activiti开发环境
4. Activiti的整体结构
5. Process流程定义和部署维护
6. Activiti用户和用户组
7. Activiti流程实例和个人任务管理
8. Activiti集成Spring、MyBatis实现自定义表单
9. 表单的介绍以及FormService的使用
10.ServiceTask自动执行任务
11.MailTask邮件任务
12.ManualTask人工任务
13.ReceiveTask接收任务
14.指定任务组办理人
15.Activiti网关设置
16.Activiti子流程
17.Activiti流程驳回、会签、挂起操作
18.Activiti集成SpringBoot
19.Activiti继承MockMVC单元测试
20.Activiti REST API数据风格的实现