目录

一. 工作流介绍

1.1 介绍

2.2 Activiti的使用步骤

1.部署activiti

2.流程定义

3.流程定义的部署

4.启动流程实例

5.用户查询待办任务

6.用户办理任务

7.流程结束

3.3 Activiti的数据库支持

3.3.1 表的介绍

3.3.2 类的介绍

4.4 流程符号的介绍

4.4.1 事件

4.4.2 活动

4.4.3 网关

5.5 流程

5.5.1 流程设计

5.5.2 流程部署

5.5.3启动流程实例

5.5.4 查询个人的待办任务

5.5.5 查询个人已完成的任务

5.5.6 使用zip包进行部署 打包

回顾

二. SpringBoot整合Activiti

1.1 pom文件

1.2 Activiti的Controller层

1.3 service层

1.4 serviceImpl

1.6 Application

1.7 serviceTask



一. 工作流介绍

1.1 介绍

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

​ Activiti是一个工作流引擎(作者: Tom Baeyens), activiti可以将业务系统中复杂的业务流程抽取出来, 使用专门的建模语言BPMN2.0进行定义, 业务流程按照预先定义的流程进行执行, 实现了系统的流程由activiti进行管理, 减少业务系统由于流程变更进行系统升级改造的工作量, 从而提高系统的健壮性, 同时减少系统开发维护成本.

​ BPMN(Business Process Model AndNotation) 业务流程模型和符号

Bpmn图形其实是通过xml表示流程, .bpmn文件使用文本编辑器打开

2.2 Activiti的使用步骤

1.部署activiti

​ Activiti是一个工作流引擎(jar包api), 业务系统访问 activiti的接口, 就可与你方便的操作流程的相关数据, 这样就可以把工作流环境与业务系统的环境集成在一起

2.流程定义

使用相关的建模工具定义业务流程(.bpmn文件) 画流程图

3.流程定义的部署

​ activiti部署业务流程定义(.bpmn文件), 使用activiti提供的api把流程内容存储起来, 在activiti执行过程可以查阅定义的内容, activiti执行把流程定义内容存储在数据库

4.启动流程实例

​ 流程实例(Processinstance), 启动一个流程实例表示一次业务流程的运行,

​ 比如请假流程, 张三请假, 与李四请假, 两个流程, 两个不同的实例, 两个流程互不影响

5.用户查询待办任务

​ 因为系统的业务流程已经交给activiti管理, 通过activiti就可以查询当前执行的流程执行到了哪里, 当前用户需要办理什么任务, 这是activiti帮我们管理, 不需要开发人员写sql

6.用户办理任务

​ 用户查询代办任务后, 就可以办理某个任务了, 如果是审批流程, 还需要其他用户审核, 这个过程activiti也帮助我们完成

7.流程结束

​ 当任务办理完成没有下一个节点任务, 这个流程实例就是完成了

3.3 Activiti的数据库支持

生成activiti提供的默认方式创建mysql表, 会创建25张表

public class TestCreate{
@Test
public void testCreateDbTable(){ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();System.out.prinln (processEngine);
}} 

3.3.1 表的介绍

​ act开头,

​ act_ge_ 通用类型数据

​ act_hi_ 历史数据, 历史的流程实例, 历史的任务

​ act_re_ 流程定义的内容, 及一些静态资源

​ act_ru_ 运行时需要操作的一些表, 流程变量, 一些运行时的数据

3.3.2 类的介绍

RepositoryService 可以操作部署相关的业务, 就是act_re这些表

RuntimeService 可以帮助我们操纵act_ru这些表

HistoryService 可以帮助我们去操纵跟历史相关的act_hi 这些表

怎么使用:

​ 利用ProcessEngine. 就可以进行调用,

activiti的配置文件

4.4 流程符号的介绍

4.4.1 事件

4.4.2 活动

4.4.3 网关

排他网关: 只有一条路径会被选择, 当两个为true时, 会执行第一个为true的线路, 排他网关与条件顺序流结合使用, default指定默认顺序流, 当所有条件都不满足时, 会执行默认顺序流

并行网关:(+) 所有路径都会被同时选择

​ 拆分: 并行执行所有的输出顺序流, 为每一条顺序流创建一个并行的线路

​ 合并: 所有的并行网关拆分完成的线路均在此等候, 直到所有线路执行完毕才继续向下执行

包容网关:(o)

​ 可以同时执行多条线路, 也可以在网关上设置条件

​ 拆分 -- 计算每条线路上的表达式, 当表达式结果为true时, 创建一个并行线路继续执行

​ 合并 -- 所有从并行网关拆分并执行完成的线路均在此等候, 直到所有的线路都执行完成后才继续向下执行

事件网关:

​ 专门为中间捕获事件设置的, 允许设置多个输出流指向不同的中间捕获事件, 当流程执行到事件网关后, 流程处于等待状态, 需要等待抛出事件才能将等待状态装换为活动状态

4.4.4 流向

​ 指的是连接两个流程节点的连线,

5.5 流程

5.5.1 流程设计

每个流程都有一个唯一的key, 绘制bpmn图, 为每一个节点指定负责人

可以将.bpmn文件改为以.xml文件结尾, 使用idea的

就可以将其变为

可以导出到桌面为png文件

5.5.2 流程部署

流程部署的三张表

public class ActivitiTest {/*** 测试流程部署* */@Testpublic void testDeployment(){/*** 1. 创建ProcessEngine 流程引擎* */ProcessEngine ProcessEngine = ProcessEngines.getDefaultProcessEngine();/*** 2.  获取RepositoryService* */RepositoryService repositoryService  =  processEngine.getRepositoryService();/*** 3. 使用service进行了流程的部署 把bpmn 和png 部署到流程中 */Deployment  deployment   =    repositoryService.createDeployment().name("出差申请流程").addClasspathResource("bpmn/evection.bpmn").addClassPathResource("bpmn/evection.png").deploy();/*** 4. 输出部署信息* */System.out.println("部署流程id="+ deployment.getId());System.out.println("部署流程名字="+ deployment.getName());}
}

5.5.3启动流程实例

/*** * 启动流程实例*/
public class TestHua {public void testStartProcess() {// 1. 创建ProcessEngineProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();// 2. 获取RunTimeServiceRuntimeService runtimeService = defaultProcessEngine.getRuntimeService();// 3. 根据定义的id启动流程  ProcessInstance myEvection = runtimeService.startProcessInstanceById("myEvection");// 4. 输出内容System.out.println("流程定义id = " + myEvection.getProcessDefinitionId());System.out.println("流程实例id = " + myEvection.getId());System.out.println("当前活动的ID: " + myEvection.getActivityId());}
}

会发生改变的表

5.5.4 查询个人的待办任务

 /***查询个人待办任务**/@Testpublic void testFindPersonalTaskList(){// 1. 获取流程引擎ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();// 2. 获取taskServiceTaskService taskService = defaultProcessEngine.getTaskService();// 3. 根据流程key 和 任务负责人 查询任务List<Task> list = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("zhangsan").list();// 4. 输出for (Task task : list) {System.out.println("流程实例id = " + task.getProcessInstanceId());System.out.println("任务id = " + task.getId());System.out.println("任务负责人 = " + task.getAssignee());System.out.println("任务名称 = " + task.getName());}}

查询个人待执行的sql

5.5.5 查询个人已完成的任务

/*** 查询已办任务* */public void completTask(){// 1. 获取流程引擎ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();// 2. 获取taskServiceTaskService taskService = defaultProcessEngine.getTaskService();// 3. 根据任务id完成任务taskService.complete("22253");}

在 act_hi_taskinst 表中

会发生改变的表

经理审批, 对应的assignee jerry 经理名字 到了哪一个审批人, 名字就变一下

 /*** * 审批人审批项目*/public void completTasksa(){// 1. 获取流程引擎// 2. 获取操作任务的任务// 3. 完成任务 参数任务id 完成张三的任务// 2. 获取taskServiceProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = defaultProcessEngine.getTaskService();// 3. 根据流程key 和 任务负责人 查询任务Task task = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("jerry").singleResult();// 4. 输出System.out.println("流程实例id = " + task.getProcessInstanceId());System.out.println("任务id = " + task.getId());System.out.println("任务负责人 = " + task.getAssignee());System.out.println("任务名称 = " + task.getName());}

当审批流程走完了了

act_ru_task 就会为null

5.5.6 使用zip包进行部署 打包

zip文件包含 bpmn 与 png文件

回顾

Bpmn图形其实是通过xml表示流程, .bpmn文件使用文本编辑器打开

二. SpringBoot整合Activiti

1.1 pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.1</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>activi-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>activi-demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><activiti.version>6.0.0</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><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter-basic</artifactId><version>${activiti.version}</version></dependency><!-- Activiti 流程图 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-common-rest</artifactId><version>${activiti.version}</version></dependency><!-- Activiti 在线设计 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-modeler</artifactId><version>5.22.0</version><exclusions><exclusion><artifactId>spring-beans</artifactId><groupId>org.springframework</groupId></exclusion><exclusion><artifactId>spring-context</artifactId><groupId>org.springframework</groupId></exclusion><exclusion><artifactId>spring-core</artifactId><groupId>org.springframework</groupId></exclusion><exclusion><artifactId>spring-tx</artifactId><groupId>org.springframework</groupId></exclusion><exclusion><artifactId>spring-web</artifactId><groupId>org.springframework</groupId></exclusion><exclusion><artifactId>spring-security-config</artifactId><groupId>org.springframework.security</groupId></exclusion><exclusion><artifactId>spring-security-core</artifactId><groupId>org.springframework.security</groupId></exclusion><exclusion><artifactId>spring-security-crypto</artifactId><groupId>org.springframework.security</groupId></exclusion><exclusion><artifactId>spring-security-web</artifactId><groupId>org.springframework.security</groupId></exclusion><exclusion><artifactId>spring-webmvc</artifactId><groupId>org.springframework</groupId></exclusion><exclusion><artifactId>activation</artifactId><groupId>javax.activation</groupId></exclusion><exclusion><artifactId>commons-io</artifactId><groupId>commons-io</groupId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
package com.example.actividemo;import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.JavaDelegate;public class ServiceTask1 implements JavaDelegate {//流程变量private Expression text1;//重写委托的提交方法@Overridepublic void execute(DelegateExecution execution) {System.out.println("serviceTask1 已经执行已经执行!");String value1 = (String) text1.getValue(execution);System.out.println(value1);execution.setVariable("var1", new StringBuffer(value1).reverse().toString());}
}package com.example.actividemo;import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.JavaDelegate;public class ServiceTask2 implements JavaDelegate {//流程变量private Expression text2;//重写委托的提交方法@Overridepublic void execute(DelegateExecution execution) {System.out.println("serviceTask2 已经执行已经执行!");String value1 = (String) text2.getValue(execution);System.out.println(value1);execution.setVariable("var1", new StringBuffer(value1).reverse().toString());}
}

1.2 Activiti的Controller层

package com.example.actividemo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/activiti")
public class ActivitiController {@Autowiredprivate ActivityConsumerService activityConsumerService;/*** 注册流程** @return*/@RequestMapping("/createDeployment")public Boolean createDeployment() {return activityConsumerService.createDeployment();}/*** 启动流程** @return*/@RequestMapping("/startActivityDemo")public Boolean startActivityDemo() {return activityConsumerService.startActivityDemo("test01");}/*** 获取待办** @return*/@RequestMapping("/getTaskList")public List getTaskList() {return activityConsumerService.getTaskList();}/*** 提交** @param taskId* @return*/@RequestMapping("/complete")public boolean complete(String taskId) {return activityConsumerService.complete(taskId);}/*** 根据流程id直接结束流程** @return* @paramru*/@RequestMapping("/deleteProcessInstance")public boolean deleteProcessInstance(String runId) {return activityConsumerService.deleteProcessInstance(runId);}}

1.3 service层

package com.example.actividemo;import java.util.List;public interface ActivityConsumerService {boolean createDeployment();boolean startActivityDemo(String key);List getTaskList();boolean complete(String taskId);boolean deleteProcessInstance(String runId);
}

1.4 serviceImpl

package com.example.actividemo;import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service("activityService")
public class ActivityConsumerServiceImpl implements ActivityConsumerService {@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;@Autowiredprivate HistoryService historyService;@Autowiredprivate RepositoryService repositoryService;/*** 注册一个流程** @return*/@Overridepublic boolean createDeployment() {DeploymentBuilder builder = repositoryService.createDeployment();builder.addClasspathResource("test01.bpmn20.xml");builder.deploy();return true;}/*** 查询待办** @return*/public List getTaskList() {return historyService.createHistoricActivityInstanceQuery().list();}/*** 根据流程key开启一个流程** @param key* @return*/@Overridepublic boolean startActivityDemo(String key) {ProcessInstance test01 = runtimeService.startProcessInstanceByKey(key);String id = test01.getId();System.out.println("流程id=" + id);return true;}/*** 根据任务id提交任务** @param taskId* @return*/@Overridepublic boolean complete(String taskId) {taskService.complete(taskId);return true;}/*** 根据流程id直接结束流程** @param runId* @return*/@Overridepublic boolean deleteProcessInstance(String runId) {runtimeService.deleteProcessInstance(runId, "结束");return true;}}

1.6 Application

package com.example.actividemo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(exclude = {org.activiti.spring.boot.SecurityAutoConfiguration.class
})
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

1.7 serviceTask

package com.example.actividemo;import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.JavaDelegate;public class ServiceTask1 implements JavaDelegate {//流程变量private Expression text1;//重写委托的提交方法@Overridepublic void execute(DelegateExecution execution) {System.out.println("serviceTask1 已经执行已经执行!");String value1 = (String) text1.getValue(execution);System.out.println(value1);execution.setVariable("var1", new StringBuffer(value1).reverse().toString());}
}package com.example.actividemo;import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.JavaDelegate;public class ServiceTask2 implements JavaDelegate {//流程变量private Expression text2;//重写委托的提交方法@Overridepublic void execute(DelegateExecution execution) {System.out.println("serviceTask2 已经执行已经执行!");String value1 = (String) text2.getValue(execution);System.out.println(value1);execution.setVariable("var1", new StringBuffer(value1).reverse().toString());}
}

1.8 项目的配置文件

server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/activi_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=88888888
spring.activiti.check-process-definitions=false
spring.activiti.process-definition-location-prefix=classpath:*
spring.activiti.process-definition-location-suffixes=.bpmn20.xml

Activiti的学习相关推荐

  1. Activiti工作流学习之流程图应用详解

    Activiti工作流学习之流程图应用详解 1.目的 了解Activiti工作流是怎样应用流程图的. 2.环境准备 2.1.相关软件及版本 jdk版本:Jdk1.7及以上 IDE:eclipse 数据 ...

  2. Activiti工作流学习笔记01

    Activiti6工作流学习笔记01 activiti工作流目前官方最新版本是7.x,但....版本不重要了.这篇笔记只是我学习activiti6过程中的自我总结.如果笔记上有错误的话,欢迎赐教,谢谢 ...

  3. 一个jeecg整合activiti的学习例子,源码下载

    社区成员:刘京华 采用技术:jeecg+ activiti 源码下载地址:http://pan.baidu.com/s/1dDxOHrV 截图演示:   2.jpg (71.81 KB, 下载次数: ...

  4. 史上最权威的 Activiti 框架学习

        Activiti5 是 由 Alfresco 软件在 2010 年 5 月 17 日发布的业务流程管理( BPM) 框架,它是覆盖了业务流程管理.工作流.服务协作等领域 的一个开源的.灵活的. ...

  5. activiti工作流学习(二)

    流程连线 流程开始→某个学生请假(一般情况/特殊情况)→班长审批通过→(进行判断,如果是一般情况直接结束;如果是特殊情况流程指向教师审批,教师审批结束后)→结束 任务设定 学生请假,执行人设置为 ${ ...

  6. Activiti工作流学习篇(一)

    一.Activiti 的概念       工作流(Workflow),指"业务过程的部分或整体在计算机应用环境下的自动化".是对工作流程及其各操作步骤之间业务规则的抽象.概括描述. ...

  7. Activiti 初步学习

    2019独角兽企业重金招聘Python工程师标准>>> 1.流程中主要用到的类库包括:runtimeService,taskService,historyService,reposi ...

  8. activiti工作流学习(四)

    并行网关 与排他网关不同,并行网关中,该网关分支的所有条件都执行完的时候,才能走到下一个任务. 有任意个条件未执行,该部分任务都不会完成. 就像是集龙珠,必须7颗都同时在,才能召唤出神龙 绘制流程图 ...

  9. 工作流学习——Activiti整体认识二步曲

    一.前言 在上一篇文章中我们将工作流的相关概念.activiti的前世今生.activiti与jbpm的比较进行学习,这篇文章我们正式进行activiti的学习,activiti的整个学习我们主要通过 ...

最新文章

  1. php 不等待返回的实现方法(异步调用)
  2. linux libodbc.so.1,CentOS6.0虚拟机上安装nginx启动的错误---缺少libpcre.so.1共享库
  3. php + mssql乱码
  4. 一些有用的SQL Server函数
  5. C++官方文档-this
  6. 仓库文件SVN总结-java教程
  7. Gym 100818I Olympic Parade(位运算)
  8. 28. 正确理解由reverse_iterator的base()成员函数所产生的iterator的用法
  9. C盘根目录出现msdia80.dll解决办法
  10. Java中.setvalue(-1)_Java State.setValue方法代碼示例
  11. 已经不能再简单的UE4中播放视频没有声音的解决方案
  12. CWE 4.7中的新视图:工业控制系统的安全漏洞类别
  13. 雷达图人格php源码,061 实例15-霍兰德人格分析雷达图
  14. JVM--藤原豆腐店自用
  15. BI神器Power Query(10)-- PQ从文件夹导入数据
  16. SDL下播放声音文件
  17. 单片机按键连接方法总结(五种按键扩展方案详细介绍)
  18. clap与slap_关于SLAP
  19. 麦语言转换python_funcat: Funcat 将同花顺、通达信、文华财经麦语言等的公式写法移植到了 Python 中。...
  20. 数据结构-链表深度刨析

热门文章

  1. 2017高校计算机挑战赛,中国高校计算机大赛-网络技术挑战赛竞赛规程(2017年.PDF...
  2. 把手账打印成书 把回忆装订成册
  3. CUDA: 对齐和未对齐结构之间的巨大访问速度差距实例
  4. MIT计算机科学录取分数线,美国麻省理工学院分数录取线
  5. linux maskrom模式,微雪电子RK3308主板CC启动模式介绍
  6. java 后台开发中model与entity(实体类)的区别
  7. linux挂载raw设备,linux创建raw设备
  8. 央视网商城app_央视网商城“中国好产品联合招商大会”召开
  9. fred dataset_Excel经济数据加载项:FRED
  10. 2020牛客暑期多校训练营(第一场)j-Easy Integration(思维,分数取模,沃斯利积分)