Activi7工作流经典实战

Activi7工作流经典实战
一、Activiti7介绍
1.1 工作流WorkFlow
1.2 Activiti工作流引擎
1.3 建模语言BPMN
1.4 Activiti使用步骤
二、Activiti环境搭建
2.1 安装插件
2.2 初始化数据库表
2.3 表结构解读
2.4 Activiti核心类
RuntimeService
TaskService
HistoryService
ManagementService
三、Activiti入门
3.1 流程符号详解
3.2 定制一个简单的请假流程
3.3 部署请假流程
3.4 启动流程实例
3.5 任务查询
3.6 流程任务处理
3.7 流程信息查询
3.8 删除流程
3.9 流程资源下载
3.10 流程历史信息查看
3.11 篇章总结
四、Activiti进阶
4.1 流程定义与流程实例
4.1.1 启动流程实例时,添加Businesskey
4.1.2 挂起、激活流程实例
4.2 流程变量
4.2.1 流程变量的作用域
4.2.2 使用流程变量
4.2.3 设置Global流程变量
1) 启动流程时设置变量 === 图灵: 楼兰 ===
2) 任务办理时设置变量
3) 通过当前流程实例设置
4) 通过当前任务设置
注意事项
4.2.4 设置Local流程变量
1) 任务办理时设置
2) 通过当前任务设置
4.3 网关
4.3.1 排他网关ExclusiveGateway
4.3.2 并行网关ParallelGateway
4.3.3 包含网关InclusiveGateway
4.3.4 事件网关EventGateway
4.4 个人任务管理
4.4.1 分配任务负责人
4.5 组任务分配
4.5.1 设置多个候选责任人
4.5.2 组任务办理流程
1、查询组任务
2、拾取(claim)任务
3、查询个人任务
4、办理个人任务
5、归还组任务
数据库表操作
五、Activiti与Spring整合
六、Activiti7与SpringBoot整合开发
1、引入maven依赖
2、创建配置文件application.yml
3、编写启动类
4、创建BPMN文件
5、使用junit方式测试
6、快速集成SpringSecurity安全框架
6、测试与Security的集成
Activi7工作流经典实战 一、Activiti7介绍
Activiti是目前使用最为广泛的开源工作流引擎,2010年5月就正是启动了。在了
解Activiti之前,我们首先要了解下什么是工作流。
1.1 工作流WorkFlow
关于什么是工作流,有一个官方的定义: 工作流是指一类能够完全自动执行的经
营过程,根据一系列规程规则,将文档、信息或任务在不同的执行者之间进行传递
和执行。其实说直白一点,就是业务上一个完整的审批流程。例如员工的入职、请
假、出差、采购等等、还有一些关键业务如订单申请、合同审核等等,这些过程,
都是一个工作流。
对于工作流,传统的处理方式往往需要有人拿着各类的文件,在多个执行部门之
间不断的审批。而当我们开始用软件来协助处理这一类审批流程时,就开始出现了
工作流系统。工作流系统可以减少大量的线下沟通成本,提高工作效率。
有了工作流系统之后,才开始出现工作流引擎。在没有专门的工作流引擎之前,
我们为了实现这样的流程控制,通常的做法都是采用状态字段的方式来跟踪流程的
变化情况。例如对一个员工请假请求,我们会定义已申请、组长已审核、部门经理
已审核等等这样一些状态,然后通过这些状态来控制不同的业务行为,比如部门经
理角色只能看到组长已审核通过的,并且请假天数超过3天的订单等等。
这种实现方式实现起来比较简单,也是软件系统中非常常用的一种方式。但是这
种通过状态字段来进行流程控制的方式还是有他的弊端。
一方面:整个流程定义不够清晰。业务流程是分散在各个业务阶段中的,从代码
的角度非常难以看到整个流程是如何定义的。
另一方面:当流程发生变更时,这种方式编写的代码就需要做非常大的变更。例
如从三级审批要增加为四级审批甚至是协同审批,那各个业务阶段的审批流程都需
要随之做大量的变更。
正是出于这些痛点,后面才有了工作流引擎。使用工作流引擎后,整个审批流程
可以在同一个地方进行整体设计,并且当审批流程发生变更时,业务程序也可以不
用改变。这样业务系统的适应能力就得到了极大提升。 其实引擎的思想无处不在。我们有Drools规则引擎,可以在程序不发生
变动的情况下,集中定义业务规则并进行修改。Aviator表达式引擎,可
以快速计算某一个表达式的结果。搜索引擎,可以快速进行统一搜索等
等。其核心思想都是将业务之间的共性抽取出来,减少业务变动对程序
的影响。
1.2 Activiti工作流引擎
Activiti正是目前使用最为广泛的开源工作流引擎。Activiti的官网地址是 https://
www.activiti.org 历经6.x和5.x两个大的版本,目前最新的版本是 Activiti Cloud
7.1.0-M11。
他可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进
行定义。业务流程按照预先定义的流程执行,整个实现流程完全由activiti进行管
理,从而减少业务系统由于流程变更进行系统改造的工作量,从而减少系统开发维
护成本,提高系统的健壮性。所以使用Activiti,重点就是两个步骤,首先使用
BPMN定义流程,然后使用Activiti框架实现流程。
1.3 建模语言BPMN
谈到BPMN,首先就要谈BPM。 BPM即Business Process Managemenet,业
务流程管理。是一种规范化的构造端到端的业务流程,以持续的提高组织业务效
率。在常见的商业管理教育如EMBA、MBA中都包含了BPM的课程。
有了BPM的需求,就出现了BPM软件。他是根据企业中业务环境的变化,推进人
与人之间,人与系统之间以及系统与系统之间的整合及调整的经营方法域解决方案
的IT工具。通过对企业业务流程的整个生命周期进行建模、自动化、管理监控和优
化,使企业成本降低,利润得到提升。BPM软件在企业中应用非常广泛,凡是有业 务流程的地方都可以使用BPM进行管理。比如企业人事办公管理、采购流程管理、
公文审批流程管理、财务管理等。
而BPMN是Business Process Model And Notation 业务流程模型和符号,就是
用来描述业务流程的一种建模标准。BPMN最早由BPMI(BusinessProcess
Management Initiative)方案提出。由一整套标准的业务流程建模符号组成。使用
BPMN可以快速定义业务流程。
BPMN最早在2004年5月发布。2005年9月开始并入OMG(The Object
Managemenet Group)组织。OMG于2011年1月发布BPMN2.0的最终版本。
BPMN是目前被各大BPM厂商广泛接受的BPM标准。Activiti就是使用BPMN2.0进
行流程建模、流程执行管理。
整个BPMN是用一组符号来描述业务流程中发生的各种事件的。BPMN通过在这
些符号事件之间连线来描述一个完整的业务流程。
而对于一个完整的BPMN图形流程,其实最终是通过XML进行描述的。通常,会
将BPMN流程最终保存为一个.bpmn的文件,然后可以使用文本编辑器打开进行查
看。而图形与xml文件之间,会有专门的软件来进行转换。 关于如何配置一个工作流,在后面的实战过程中我们会接触到。
1.4 Activiti使用步骤
通常使用Activiti时包含以下几个步骤:
部署activiti: Activiti包含一堆Jar包,因此需要把业务系统和Activiti的环境集成
在一起进行部署。
定义流程: 使用Activiti的建模工具定义业务流程.bpmn文件。
部署流程定义: 使用Activiti提供的API把流程定义内容存储起来,在Acitivti执行
过程汇总可以查询定义的内容。Activiti是通过数据库来存储业务流程的。
启动流程实例: 流程实例也叫ProcessInstance。启动一个流程实例表示开始一
次业务流程的运作。例如员工提交请假申请后,就可以开启一个流程实例,从而
推动后续的审批等操作。
用户查询待办任务(task):因为现在系统的业务流程都交给了activiti管理,通过
activiti就可以查询当前流程执行到哪个步骤了。当前用户需要办理哪些任务也就
同样可以由activiti帮我们管理,开发人员不需要自己编写sql语句进行查询了。
用户办理任务:用户查询到自己的待办任务后,就可以办理某个业务,如果这个
业务办理完成还需要其他用户办理,就可以由activiti帮我们把工作流程往后面的
步骤推动。
流程结束:当任务办理完成没有下一个任务节点后,这个流程实例就执行完成
了。
了解这些后,我们来开始进入实战内容。
二、Activiti环境搭建
使用Activiti需要的基本环境包括: JDK 8或以上版本;然后需要一个数据库用来保
存流程定义数据,建议mysql 5或以上版本。
2.1 安装插件
开发工具IDEA,在IDEA中需要安装Activiti的流程定义工具插件actiBPM。目前该插
件从2014年11月后就没有再更新,对于IDEA版本只支持到2019.1。新版本的IDEA
已经无法从插件市场搜索到该插件。安装时,可以到jetBrain的插件市场 https://pl
ugins.jetbrains.com/ 搜索actiBPM插件,下载到本地后,从本地安装该插件。 数据库类
版本
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
postgres8.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
安装完成后,就可以使用这个插件在项目中编辑.bpmn的文件来定义业务流程了。
但是这个文件之前介绍过,他的本质是一个xml文本文件,所以还是需要更多的了解
xml的配置方式。
2.2 初始化数据库表
activiti支持多种数据库,详细的版本情况如下:
我们这里选择mysql数据库。接下来按照以下步骤来初始化activiti所需要的数据
表。
1- 在mysql中创建一个数据库activiti,将会用来创建activiti相关的表。 然后,activiti需要依赖的业务表有25张,而activiti中提供了工具帮我们生成所需要
的表。
2- 创建一个maven工程BasicDemo,在pom.xml中引入以下依赖:
CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;
1
<properties>
<slf4j.version> 1.6.6 </slf4j.version>
<log4j.version> 1.2.12 </log4j.version>
<activiti.version> 7.1.0.M6 </activiti.version>
<activiti.cloud.version> 7.0.0.Beta1 </activiti.cloud.version>
<mysql.version> 8.0.20 </mysql.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.cloud.version} </version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId> mysql </groupId>
<artifactId> mysql-connector-java </artifactId>
<version> ${mysql.version} </version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId> org.mybatis </groupId>
<artifactId> mybatis </artifactId>
<version> 3.4.5 </version>
</dependency>
<!-- 链接池 -->
<dependency>
<groupId> commons-dbcp </groupId>
<artifactId> commons-dbcp </artifactId>
<version> 1.4 </version>
</dependency>
<dependency>
<groupId> junit </groupId>
<artifactId> junit </artifactId>
<version> 4.12 </version>
</dependency>
<!-- log start -->
<dependency>
<groupId> log4j </groupId>
<artifactId> log4j </artifactId>
<version> ${log4j.version} </version>
</dependency>
<dependency>
<groupId> org.slf4j </groupId>
<artifactId> slf4j-api </artifactId>
<version> ${slf4j.version} </version>
</dependency>
<dependency>
<groupId> org.slf4j </groupId>
<artifactId> slf4j-log4j12 </artifactId>
<version> ${slf4j.version} </version>
</dependency>
</dependencies>
3- 添加log4j日志配置
这里采用的是log4j来记录日志,所以需要在resources目录下创建log4j.properties
文件来对日志进行配置
4- 添加activiti的配置文件
activiti默认就会使用mysql来创建表。创建时需要先创建一个配置文件
activiti.cfg.xml,来对数据源信息进行定义。
在resources目录下创建activiti.cfg.xml文件。
注意:这个目录其实就是classpath下的默认位置。这是activiti默认读取
的目录和文件。
创建在其他目录下也是可以的,但是就需要在生成时指定文件的目录和
名字。
配置文件的基础内容如下: -这里主要是定义几个namespace。
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory = debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to
CONSOLE.
log4j.logger.org.apache.axis.enterprise = FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d{ISO8601} %-6r[%15.15t]
%-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE = org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File = f : \act\activiti.log
log4j.appender.LOGFILE.Append = true
log4j.appender.LOGFILE.layout = org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern = %d{ISO8601} %-6r[%15.15t]
%-5p %30.30c %x - %m\n
5- 在activiti.cfg.xml中进行配置
我们可以在activiti.cfg.xml中添加关于数据库的基础配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:tx = "http://www.springframework.org/schema/tx"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-
beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd" >
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:tx = "http://www.springframework.org/schema/tx"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-
beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd" >
<!-- 这里可以使用 链接池 dbcp-->
<bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" >
<property name = "driverClassName" value = "com.mysql.cj.jdbc.Driver"
/>
<property name = "url" value = "jdbc:mysql://localhost:3306/activiti?
serverTimezone=GMT%2B8" />
<property name = "username" value = "root" />
<property name = "password" value = "root" />
<property name = "maxActive" value = "3" />
<property name = "maxIdle" value = "1" />
</bean>
<bean id = "processEngineConfiguration"
class = "org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration" >
<!-- 引用数据源 上面已经设置好了 -->
注意:1、processEngineConfiguration这个名字最好不要修改。这是
activiti读取的默认Bean名字。
2、在processEngineConfiguration中也可以直接配置jdbcDriver、
jdbcUrl、jdbcUsername、jdbcPassword几个属性。
3、关于databaseSchemaUpdate这个属性,稍微跟踪一下源码就能看
到他的配置方式:
默认是false;表示不创建数据库,只是检查数据库中的表结构,不满足
就会抛出异常
create-drop:表示在引擎启动时创建表结构,引擎处理结束时删除表结
构。
true:表示创建完整表机构,并在必要时更新表结构。
6- 编写java程序生成表。
创建一个测试类,调用activiti的工具类,直接生成activiti需要的数据库表。代码如
下:
<property name = "dataSource" ref = "dataSource" />
<!-- activiti 数据库表处理策略 -->
<property name = "databaseSchemaUpdate" value = "true" />
</bean>
</beans>
package com . roy ;
import org . activiti . engine . ProcessEngine ;
import org . activiti . engine . ProcessEngines ;
import org . junit . Test ;
/**
* @author :楼兰
* @date Created in 2021/4/7
* @description:
**/
public class TestCreateTable {
/**
* 生成 activiti 的数据库表
*/
1
15
16 注意:从这个代码就能看出我们之前那些默认配置的作用。
ProcessEngines.getDefaultProcessEngine()这行代码默认就会去读取
classpath:下的activiti.cfg.xml和activiti-context.xml两个配置文件。并
且从spring容器中加载名为processEngineConfiguration的Bean。
执行这个脚本就会完成mysql的表结构创建。如果执行正常,可以看到执行了一大
堆的sql语句,最终打印出一行日志
这就表示引擎创建成功了。同时在mysql中可以看到activiti用到的25张表。
这些表机构通常也可以导出成sql文件,然后直接进行移植。但是考虑到
不同版本可能会有微调,所以通常不建议以sql文件的方式移植。
@Test
public void testCreateDbTable () {
// 默认创建方式
ProcessEngine processEngine =
ProcessEngines . getDefaultProcessEngine ();
// 通用的创建方式,指定配置文件名和 Bean 名称
// ProcessEngineConfiguration processEngineConfiguration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("ac
tiviti.cfg.xml", "processEngineConfiguration");
// ProcessEngine processEngine1 =
processEngineConfiguration.buildProcessEngine();
System . out . println ( processEngine );
}
}
org.activiti.engine.impl.ProcessEngineImpl@77307458
1 表分类
表名
解释
一般数据
[ACT_GE_BYTEARRAY]
通用的流程定义和流程资源
[ACT_GE_PROPERTY]
系统相关属性
流程历史记
[ACT_HI_ACTINST]
历史的流程实例
[ACT_HI_ATTACHMENT] 历史的流程附件
[ACT_HI_COMMENT]
历史的说明性信息
[ACT_HI_DETAIL]
历史的流程运行中的细节信息
[ACT_HI_IDENTITYLINK] 历史的流程运行过程中用户关系
[ACT_HI_PROCINST]
历史的流程实例
[ACT_HI_TASKINST]
历史的任务实例
[ACT_HI_VARINST]
历史的流程运行中的变量信息
流程定义表
[ACT_RE_DEPLOYMENT] 部署单元信息
[ACT_RE_MODEL]
模型信息
[ACT_RE_PROCDEF]
已部署的流程定义
运行实例表
[ACT_RU_EVENT_SUBSCR]运行时事件
[ACT_RU_EXECUTION]
运行时流程执行实例
2.3 表结构解读
从这些刚才创建的表中可以看到,activiti的表都以act_开头。第二个部分表示表
的用途。用途也和服务的API对应。
ACT_RE :'RE'表示 repository。 这个前缀的表包含了流程定义和流程静态资源
(图片,规则,等等)。
ACT_RU :'RU'表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异
步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流
程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_HI :'HI'表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任
务等等。
ACT_GE : GE 表示 general。 通用数据, 用于不同场景下
完整的数据库表作用如下: 表分类
表名
解释
[ACT_RU_IDENTITYLINK]
运行时用户关系信息,存储任务节点与参与
者的相关信息
[ACT_RU_JOB]
运行时作业
[ACT_RU_TASK]
运行时任务
[ACT_RU_VARIABLE]
运行时变量表
service名称
service作用
RepositoryService
activiti的资源管理类
RuntimeService
activiti的流程运行管理类
TaskService
activiti的任务管理类
HistoryService
activiti的历史管理类
ManagerService
activiti的引擎管理类
2.4 Activiti核心类
当拿到ProcessEngine之后,我们可以简单的看一下他的方法
这几个service就是activiti最为核心的几个服务实现类。围绕activiti的核心业务功能
大都通过这几个service来组成。
简单介绍:
RepositoryService
是activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工
作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计
算机。 除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操
作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引
擎自动生成的流程图。
获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。
RuntimeService
Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
TaskService
Activiti的任务管理类。可以从这个类中获取任务的信息。
HistoryService
Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根
据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实
例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。
ManagementService
Activiti的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不
在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。
三、Activiti入门
在这一章,我们就来创建一个Activiti工作流,并启动这个工作流。了解Activiti的
基础开发流程。
创建Activiti工作流的主要步骤包含以下几步:
1. 定义流程。按照BPMN的规范,使用流程定义工具,将整个流程描述出来
2. 部署流程。把画好的BPMN流程定义文件加载到数据库中,生成相关的表数据
3. 启动流程。使用java代码来操作数据库表中的内容。
3.1 流程符号详解
接下来我们来了解下在流程设计中常见的符号。BPMN2.0的基本符号主要包含以
下几类: 事件 Event
事件是驱动工作流发展的核心对象,在工作流的流程定制过程中会经常看到。
活动 Activity
活动是工作或任务的一个通用术语。一个活动可以是一个任务,也可以是当前流程
的子处理流程。并且,活动会有不同的类型。例如Activiti中定义了
UserTask,ScriptTask,ServiceTask,MailTask等等多种类型。这些活动是构成整个业
务流程的主体。
网关 GateWay
网关是用来处理角色的,他决定了工作流的业务走向。有几种常用的网关需要了解
一下:
排他网关
只有一条路径会被选择。流程执行到该网关时,会按照输出流的顺序逐个计算,当
条件的结果为true时,继续执行当前网关的输出流。
如果有多条线路计算结构都是true,则会执行第一个值为true的路线。如果所有
网关计算结果都没有true,引擎会抛出异常。
排他网关需要和条件顺序流结合使用,default属性指定默认顺序流,当所有的条
件不满足时会执行默认顺序流。 并行网关
所有路径会被同时选择。
并行执行所有输出顺序流,为每一条顺序流创建一个并行执行路线。最终,在所有
的执行路线都执行完后才继续向下执行。
包容网关
可以同时执行多条路线。相当于是排他网关和并行网关的结合。
可以在网关上设置条件,计算每条路线上的表达式。当表达式计算结果为true时,
创建一个并行线路并继续执行。最终,当所有需要执行的线路都执行完成后才继续
向下执行。
事件网关
专门为中间捕获事件而设置。允许设置多个输出流指向多个不同的中间捕获事件。
当流程执行到事件网关后,流程出于等待状态,需要等待抛出对应的事件才能将等
待状态转换为活动状态。
流向 Flow
流就是连接两个流程节点的连线,代表了流程之间的关联关系。
注意:Activiti的BPMN符号是在标准符号基础上做了一定的扩展。你可
以新建一个BPMN文件,然后对照actBPM工具提供的工作流图形来理
解。
3.2 定制一个简单的请假流程
首先在resources目录下创建bpmn目录,然后在目录下创建一个Bomn文件,起名
Leave,表示是一个请假流程。
然后我们在流程图中拖拽出下图的流程图 这里注意每个模块都可以选中后在左侧设置他的属性。
这里,Assignee属性表示是这个任务的负责人。这里我们给 创建出差申请 设置负
责人 worker;部门经理审批 设置负责人 manager;财务审批 设置负责人
financer。
设置完成后,记得点击一下流程的空白页,在左侧设置整个流程的属性。 这样,我们整个员工出差申请的流程就定义完成了。之前介绍过,这个文件实际上
是一个xml文件,所以,这个文件是可以用文本编辑器直接打开的。整个文件大致是
这样
其中根节点是definitions节点。在这个节点中,可以定义多个工作流程process节
点。这也就意味着可以在一个图中定义多个工作流,但是通常在使用过程中建议一
个文件只包含一个流程定义,这样可以简化维护难度。definitions节点中,xmlns
和tagetNamespace两个属性是必须要包含的。
然后在文件中,包含了以标签描述的流程定义部分以及以
<bpmndi:BPMNDiagram >标签描述的流程布局定义部分。分别用来定义工作流
程以及流程图的布局信息。
文件关闭后,重新打开,可能会出现中文乱码的问题。这是因为IDEA的
字符集问题。此时,需要修改IDEA的配置文件。 在IDEA中选Help ->
Edit Custom VM Options 菜单,在打开的文件最后加上一行-
Dfile.encoding=UTF-8配置,然后重启IDEA即可。
3.3 部署请假流程 接下来,需要将设计器中定义的流程部署到activiti的数据库中。activiti提供了api将
流程定义的bpmn和png文件部署到activiti中。
要获取png图片文件,可以直接截图,也可以使用IDEA导出。导出时,先将文件修
改为Leave.bpmn.xml,然后右键该文件,选择Diagrams -> Shwo BPMN 2.0
Diagrams,可以打开图片工具,然后选择上方的导出按钮,就可以导出一个png文
件。
部署流程时,可以分别上传bpmn文件和png文件,也可以将两个文件打成zip压缩
包一起上传。
public class ActivitiDemo {
/**
* 部署流程定义 文件上传方式
*/
@Test
public void testDeployment (){
// 1 、创建 ProcessEngine
ProcessEngine processEngine =
ProcessEngines . getDefaultProcessEngine ();
// 2 、得到 RepositoryService 实例
RepositoryService repositoryService =
processEngine . getRepositoryService ();
// 3 、使用 RepositoryService 进行部署
Deployment deployment = repositoryService . createDeployment ()
. addClasspathResource ( "bpmn/Leave.bpmn" ) // 添加 bpmn 资源
//png 资源命名是有规范的。 Leave.[key].[png|jpg|gif|svg] 或者 Leave.
[png|jpg|gif|svg]
. addClasspathResource ( "bpmn/Leave.myLeave.png" ) // 添加 png 资源
. name ( " 请假申请流程 " )
. deploy ();
// 4 、输出部署信息
System . out . println ( " 流程部署 id " + deployment . getId ());
System . out .
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值