首先需要先学习下bpmn,学会如何画工作流程图(idea需要安装好bpmn插件)
对于整个流程,需要写出id和name,这个name指的是流程定义的名称
对于每一个任务,需要写出name和节点负责人(assignee或者candidate user或者candidate groups,这里可以直接写死,也可以在程序运行中写入)
网关:
1.排他网关
条件判断直接连接到排他网关,排他网关只允许一个通过
2.并行网关
并行网管会忽略分支上的所有条件,走每一个分支,然后汇总完成后,才会继续向下执行
3.包含网关
包含网关会使用分支上的条件,执行满足条件的分支,并在最后汇总后,继续向下执行
一、引入activiti的相关依赖
这里需要说明下,在activiti-spring依赖中已经引入了大部分spring的相关依赖
<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>
<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>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
二、编写activiti配置文件activiti.cfg.xml
配置数据源,可配置为直接更新生成数据库25张activiti相关表,需要注意的是,我们这里采用的是默认的方式,所以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">
<!--dbcp链接池-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///activiti"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="maxActive" value="3"/>
<property name="maxIdle" value="1"/>
</bean>
<!--在默认方式下 bean的id 固定为 processEngineConfiguration-->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!--配置数据库相关的信息-->
<!--数据库驱动
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>-->
<!--数据库链接
<property name="jdbcUrl" value="jdbc:mysql:///activiti"/>-->
<!--数据库用户名
<property name="jdbcUsername" value="root"/>-->
<!--数据库密码
<property name="jdbcPassword" value="123456"/>-->
<!--直接引用上面配置的链接池-->
<property name="dataSource" ref="dataSource"/>
<!--actviti数据库表在生成时的策略
true - 如果数据库中已经存在相应的表,那么直接使用,
如果不存在,那么会创建-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
三、简单介绍及使用
activiti数据库一共涉及到25张表
而操作这些数据库表并不需要我们自己来变写代码,而是使用由acitiviti帮我们封装的serivice
获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
之前的那些service的获取我们可以通过ProcessEngine来获取
我们通常使用以下service
1.部署流程,这里的name设置的是
在部署流程阶段,会在[ACT_RE_DEPLOYMENT]表中插入一条部署信息
2.启动流程
会在[ACT_RE_PROCDEF]中新增一条流程定义(同一种事务流程只会添加一次)
并在[ACT_HI_PROCINST]中添加本次流程实例
然后会根据流程的分支情况在ACT_RU_EXECUTION表中添加执行实例注意这里的流程执行实例和上面的流程实例不同,所谓执行实例就是一般来讲一个流程实例都有一条主线,如果一个流程由多个主线,则就会由多个执行实例。
并会把走到的每一个节点都记录在ACT_HI_ACTINST表中作为历史
流程启动以后会按照流程产生task任务,当前待执行任务会放入[ACT_RU_TASK]表
同时也会在[ACT_HI_TASKINST]表中添加
3.查询个人任务
完成个人节点任务
查询流程定义
删除流程,如果是普通删除,则前提是该部署的所有流程实例全部完结,如果需要强制删除,则可以采用级联删除
以流程为主,查询该流程的进程历史信息:
以负责人为主,查询该负责人已审批的任务:
四、高阶功能
(一)关联流程实例和业务实例
(二)流程的挂起与激活
1.全部流程实例挂起与激活
会操作[ACT_RU_TASK][ACT_RU_EXECUTION][ACT_RE_PROCDEF]表中SUSPENSION_STATE字段的状态
2.单个流程实例挂起与激活
会操作[ACT_RU_TASK][ACT_RU_EXECUTION]表中SUSPENSION_STATE字段的状态
(三)动态分配项目负责人
方式1:使用UEL表达式,${assignee0}
方式2:通过监听器的方式
编写监听器类MyTaskListener继承TaskListener(上面图片里选择的是All,所以还需要判断event类型,如果选择CREAT,则不需要判断)
(四)流程变量
1.global变量-案例
global可以加在连线上,点击连线,在condition中添加条件,可以使用uel-value也可以使用uel-方法,这里使用${evection.num}
创建Evection继承Serializable
启动流程
当然上述在启动的时候如果没有设置evection,也能在完成任务的时候设置global变量,如下:
或者也能使用TaskService来增添变量,前提是任务ID为未完成任务(这里由于可能存在多个流程实例的多个任务,所以在为某一个流程实例添加全局变量的时候需要指定其下的任务ID)
或者也能在流程实例设置global变量,前提是当前流程实例没有结束
以上设置的global变量都能通过该方法processInstance.getProcessVariables()查询到,已完成的流程实例也能通过下面的方法查询到
能通过下面的方法查询
taskService.getVariable()和task.getProcessVariables();
2.local变量-案例,local变量只能在任务节点设置
local变量查询方法
taskService.getVariableLocal()和task.getTaskLocalVariables();
已完成的任务能查到用过的变量
(五)组任务-一个任务节点能有多个人审批,这里可以直接写死,也可以使用uel表达式动态设置,需要注意的是uel设置users的时候,不同的组员用逗号分科开,格式为字符串
1.查询组任务
2.候选人拾取任务
3.任务的归还
4.任务的交接