概述

在这一节,我们将创建一个 Activit 工作流,并启动这个流程,主要包含以下几个步骤:

  1. 定义流程,按照 BPMN 的规范,使用流程定义工具,用流程符号把整个流程描述出来

  2. 部署流程,把画好的流程定义文件,加载到数据库中,生成表的数据

流程设计器的使用

在 resources 目录下创建一个 bpmn 目录,用来存放流程定义文件。选中 bpmn 目录,点击菜单 New -> New Activity 6.x BPMN 2.x file,创建一个 *.bpmn20.xml。选中该文件,右键 view BPMN(Activity ) Diagram,可以看到 BPMN-Activiti-Diagram 流程设计页面。在该页面右键,可以在菜单选择图形,拖拽图形,连线,即可完成流程设计图

连线的时候,要选中图形,这时在图形的右上角会出现一个箭头符号。双击选中箭头符号,右键按住不放即可拉长完成连线

选中一个图形,下方会出现一个属性栏,以创建出差申请为例,这里只填任务名称和负责人

流程部署

流程部署就是将在设计器中定义的流程部署到 activiti 数据库中,Activiti 提供了多种部署流程的方式,包括自动部署、classpath 部署、输入流部署、zip/bar 部署和上传部署等方式,下面分别进行介绍:

1. 自动部署

Activiti7 可以自动部署流程,前提是在 resources 目录下,创建一个新的目录 processes,用来放置 bpmn 文件

2. classpath 部署

classpath 部署方式为采用代码进行部署,使用 Java 代码实现如下:

  1. public class ActivitDemo {
  2. @Test
  3. public void testDeployment() {
  4. // 1. 创建 ProcessEngine
  5. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  6. // 2. 获取 RepositoryService
  7. RepositoryService repositoryService = processEngine.getRepositoryService();
  8. // 3. 使用 service 进行流程部署,即把 bpmn 部署到数据库,并定义流程的名称
  9. Deployment deploy = repositoryService.createDeployment()
  10. // 定义流程资源名称
  11. .name("出差申请流程")
  12. // 加载待部署的资源,可以多次引用
  13. .addClasspathResource("bpmn/evection.bpmn20.xml")
  14. // 完成部署
  15. .deploy();
  16. }
  17. }

3. 输入流部署

Activiti 提供了按输入流(InputStream)方式部署资源,输入流的来源可以有多种,例如本地计算机、classpath 读取、网络读取方式等,下面是读取本地计算机方式进行部署方式的示例代码

  1. public class ActivitDemo {
  2. @Test
  3. public void testDeployment() {
  4. // 1. 创建 ProcessEngine
  5. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  6. // 2. 获取 RepositoryService
  7. RepositoryService repositoryService = processEngine.getRepositoryService();
  8. // 3. 获取输入流
  9. String filePath = "D:/workflow/bpmn/evection.bpmn20.xml";
  10. FileInputStream fileIns = new FileInputStream(filePath);
  11. // 4. 使用 service 进行流程部署
  12. Deployment deploy = repositoryService.createDeployment()
  13. .name("出差申请流程")
  14. .addInputStream("bpmn/evection.bpmn20.xml", fileIns)
  15. .deploy();
  16. }
  17. }

4. zip/bar 部署

将流程资源文件压缩成 zip 包进行部署,同样采用流的方式

  1. public void deployProcessByZip() {
  2. // 1. 获取流程引擎
  3. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  4. // 2. 获取 RepositoryService
  5. RepositoryService repositoryService = processEngine.getRepositoryService();
  6. // 3. 流程部署
  7. InputStream inputStream = this.getClass()
  8. .getClassLoader()
  9. .getResourceAsStream("bpmn/evection.zip");
  10. ZipInputStream zipInputStream = new ZipInputStream(inputStream);
  11. repositoryService.createDeployment()
  12. .addZipInputStream(zipInputStream)
  13. .deploy();
  14. }

5. 按字符串方式部署

采用字符串方式进行部署,实际是把一个字符串转换为字节流后进行部署,也为开发人员提供了多一种部署方式

  1. public void deployProcessByStr() {
  2. // 1. 获取流程引擎
  3. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  4. // 2. 获取 RepositoryService
  5. RepositoryService repositoryService = processEngine.getRepositoryService();
  6. // 3. 构建字符串
  7. String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions>...</definitions>"
  8. // 4. 流程部署
  9. repositoryService.createDeployment()
  10. .name("出差申请流程")
  11. .addStr("bpmn/evection.bpmn20.xml", str)
  12. .deploy();
  13. }

采用字符串进行部署的优点是可以通过用户界面定义一个流程,然后进行部署,或者在测试时,直接将流程代码写入程序,进行流程部署

6. 动态 BPMN 模型部署

通过在程序中动态生成流程模型方式进行部署,动态创建 BPMN,需要在程序中指定每一个元素,并给出元素间的关系,最后将这些元素整合为一个完整的 BPMN

  1. public void testDeploymentByBPMN() {
  2. // 1. 创建 BPMN 模型实例
  3. BpmnModel bpmnModel = new BpmnModel();
  4. // 2. 创建开始事件
  5. StartEvent startEvent = new StartEvent();
  6. startEvent.setId("startEvent");
  7. startEvent.setName("动态创建开始节点");
  8. // 3. 创建用户任务
  9. UserTask userTask = new UserTask();
  10. userTask.setId("userTask1");
  11. userTask.setName("用户任务节点1");
  12. // 4. 创建结束事件
  13. EndEvent endEvent = new EndEvent();
  14. endEvent.setId("endEvent");
  15. endEvent.setName("动态创建结束节点");
  16. // 5. 定义连接
  17. ArrayList<SequenceFlow> sequenceFlows = new ArrayList<>();
  18. ArrayList<SequenceFlow> toEnd = new ArrayList<>();
  19. SequenceFlow s1 = new SequenceFlow();
  20. s1.setId("sequenceFlow1");
  21. s1.setName("开始节点指向用户任务节点");
  22. s1.setSourceRef("startEvent");
  23. s1.setTargetRef("userTask1");
  24. sequenceFlows.add(s1);
  25. SequenceFlow s2 = new SequenceFlow();
  26. s2.setId("sequenceFlow2");
  27. s2.setName("用户任务节点指向结束节点");
  28. s2.setSourceRef("userTask1");
  29. s2.setTargetRef("endEvent");
  30. toEnd.add(s2);
  31. startEvent.setOutgoingFlows(sequenceFlows);
  32. userTask.setOutgoingFlows(toEnd);
  33. userTask.setIncomingFlows(sequenceFlows);
  34. endEvent.setIncomingFlows(toEnd);
  35. Process process = new Process();
  36. process.setId("process1");
  37. process.setName("test");
  38. process.addFlowElement(startEvent);
  39. process.addFlowElement(s1);
  40. process.addFlowElement(userTask);
  41. process.addFlowElement(s2);
  42. process.addFlowElement(endEvent);
  43. bpmnModel.addProcess(process);
  44. new BpmnAutoLayout(bpmnModel).execute();
  45. // 6. 部署
  46. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  47. RepositoryService repositoryService = processEngine.getRepositoryService();
  48. Deployment deploy = repositoryService.createDeployment()
  49. .name("出差申请流程")
  50. .addBpmnModel("evection.bpmn20.xml", bpmnModel)
  51. .deploy();
  52. }

7. 相关数据表分析

流程部署后,流程相关的资源全部以数据流的形式存储到数据表中,实际运行中,流程的处理都是通过调用数据表中的相关资源进行处理,下面介绍流程相关的数据表:

  • act_re_deployment

    流程部署表,用于存放流程定义的部署信息,部署一个流程就会增加一条记录

  • act_re_procdef

    流程定义表,用于存放流程定义的属性信息,和 act_re_deployment 是一对多的关系,act_re_procdef 表可以有多条记录,每条记录对应 act_re_deployment 中的一条记录

  • act_ge_bytearray

    资源文件表,部署流程时,会将 BPMN 流程定义文件保存为一条记录,如果部署的流程还包括其他资源,也会增加相应的记录,例如 png 图片文件

Activiti 学习(二)—— Activiti 流程定义和部署的更多相关文章

  1. Activiti学习笔记3 — 流程定义

    一.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 二.发布一个流程 ...

  2. activiti学习6:启动流程后动态获取流程图

    目录 activiti学习6:启动流程后动态获取流程图 一.绘图原理 二.根据流程定义id绘图 三.根据流程实例id绘图 3.1 基本原理 3.2 当前节点的获取 3.3 走过的节点的获取 3.4 绘 ...

  3. activiti学习5:开启流程和流程前进

    目录 activiti学习5:开启流程和流程前进 一.流程和任务的关系 二.开启流程 2.1根据流程定义key开启流程 三.查询用户任务 3.1 TaskQuery 四.完成任务 activiti学习 ...

  4. Activiti学习笔记4 — 流程实例化

    1.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 2.启动流程 流程 ...

  5. C++ template学习二 类模板定义及实例化

    一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员.默写成员函数的参数.某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的). 如果一个类中数据成员 ...

  6. Struts2框架学习(二)——访问流程及架构

    1.Struts2的执行流程 从客户端发送请求过来,先经过前端控制器(核心过滤器StrutsPrepareAndExecuteFilter)过滤器中执行一组拦截器(一组拦截器就会完成部分功能代码),拦 ...

  7. ballerina 学习二十六 项目docker 部署&& 运行(二)

    ballerina 从发布,到现在官方文档的更新也是很给力的,同时也有好多改进,越来越好用了 可以参考官方文档 https://ballerina.io/learn/by-guide/restful- ...

  8. ballerina 学习二十五 项目docker 部署&& 运行

    ballerina 官方提供了docker 的runtime,还是比较方便的 基本项目创建 使用cli创建项目 按照提示操作就行 ballerina init -i 项目结构 添加了dockerfil ...

  9. Activiti学习笔记目录

    1.Activiti学习笔记1 — 下载与开发环境的配置: 2.Activiti学习笔记2 — HelloWorld: 3.Activiti学习笔记3 — 流程定义: 4.Activiti学习笔记4 ...

随机推荐

  1. 蓝凌OA前台任意文件读取漏洞利用

    近期CNVD爆出漏洞编号:CNVD-2021-28277,首次公开日期为2021-04-15,蓝凌oa存在多个漏洞,攻击者可利用该漏洞获取服务器控制权.今天挑选一个蓝凌OA前台任意文件读取漏洞进行分析 ...

  2. 什么是RSA

    一.RSA引入: RSA是什么,嗯,这是一个好问题,有没有兴趣啊 二.RSA的解释: RSA是一种加密方式,它是现代密码学的代表(什么是现代密码学,这个吗,我感觉就是我们所使用的密码的加密的方式之一可 ...

  3. HCIA-网络层包结构

    网络层 关心-->转发 IPV4协议 IPV6协议 寻址 转发 标识位置 IPV6: 86DD MAC定位局部 网络定位全局 对于上层数据如果过大,网络层可以分组,实现分组转发 环路:发送了一个 ...

  4. MapReduce框架原理-InputFormat数据输入

    InputFormat简介 InputFormat:管控MR程序文件输入到Mapper阶段,主要做两项操作:怎么去切片?怎么将切片数据转换成键值对数据. InputFormat是一个抽象类,没有实现怎 ...

  5. 第5篇-调用Java方法后弹出栈帧及处理返回结果

    在前一篇 第4篇-JVM终于开始调用Java主类的main()方法啦 介绍了通过callq调用entry point,不过我们并没有看完generate_call_stub()函数的实现.接下来在ge ...

  6. Run Shell Commands in Python

    subprocess.call This is the recommended way to run shell commands in Python compared with old-fashio ...

  7. 基于SpringBoot的在线问卷调查管理系统

    注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SpringBoot 前端框架:vue 数据库:MySQL 设计模式:MVC 架构:B/S 源码类型 ...

  8. CVE-2020-2555漏洞复现&&流量分析

    CVE-2020-2555漏洞复现&&流量分析 一.准备环境 windows7: weblogic 12.2.1.4.0 JDK版本为jdk-8u261 关于weblogic搭建可以看 ...

  9. CVE-2021-21978 VMware View Planner 远程代码执行漏洞通告 | 附 POC

    漏洞简介 VMware 是一家云基础架构和移动商务解决方案厂商,View Planner 是他旗下推出的一款针对view桌面的测试工具.2021年03月02日,VMware 官方披露了 CVE-202 ...

  10. 程序员作图工具和技巧,你 get 了么?

    分享程序员常用的画图软件和小技巧 大家好,我是鱼皮. 说实话,我觉得做个程序员挺好的.日常工作有很多,写代码.对需求.写方案等等,但我最爱画图:流程图.架构图.交互图.功能模块图.UML 类图.部署图 ...