Flowable入门案例

资料地址1614912120/Flowable (github.com)icon-default.png?t=N7T8https://github.com/1614912120/Flowable
步骤1:添加Flowable依赖

首先,您需要将Flowable引擎集成到您的项目中。您可以通过Maven、Gradle或手动下载jar包的方式来添加Flowable的依赖。

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>Flowable</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>flowable-test-b</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.flowable</groupId><artifactId>flowable-engine</artifactId><version>6.7.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.13</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>compile</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>
步骤2:创建流程定义

使用BPMN 2.0标准,创建一个新的流程定义文件。您可以使用Flowable提供的模型设计器,也可以手动编写BPMN XML文件。定义流程中的各个活动、网关、事件等。

步骤3:部署流程定义

将流程定义部署到Flowable引擎中,以便后续启动流程实例。您可以将流程定义文件打包成一个zip文件,并通过Flowable提供的API来进行部署。

 public static void main(String[] args) {/*** 部署流程*/// 配置数据库相关信息 获取 ProcessEngineConfigurationProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration().setJdbcUrl("jdbc:mysql://ip:3306/flowable?serverTimezone=UTC").setJdbcUsername("root").setJdbcPassword("123456").setJdbcDriver("com.mysql.cj.jdbc.Driver").setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);// 获取流程引擎对象ProcessEngine processEngine = cfg.buildProcessEngine();// 部署流程 获取RepositoryService对象RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deployment = repositoryService.createDeployment()     //创建对象.addClasspathResource("MyHolidayUI.bpmn20.xml")     //添加部署文件// 设置部署流程的名称.name("请求流程")//执行操作.deploy();System.out.println("deployment.getId() = " + deployment.getId());System.out.println("deployment.getName() = " + deployment.getName());}
步骤4:启动流程实例

使用Flowable的API,通过流程定义的Key来启动一个新的流程实例。您可以在启动流程实例时传入需要的参数和变量。

/*** 启动流程实例*/@Testpublic void testRunProcess() {// 配置数据库相关信息 获取 ProcessEngineConfigurationProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration().setJdbcUrl("jdbc:mysql://ip:3306/flowable?serverTimezone=UTC").setJdbcUsername("root").setJdbcPassword("123456").setJdbcDriver("com.mysql.cj.jdbc.Driver").setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);//获取流程引擎对象ProcessEngine processEngine = cfg.buildProcessEngine();// 启动流程实例通过 RuntimeService 对象RuntimeService runtimeService = processEngine.getRuntimeService();//构建流程变量HashMap<String, Object> variables = new HashMap<>();variables.put("employee","张三") ;// 谁申请请假variables.put("nrOfHolidays",3); // 请几天假variables.put("description","工作累了,想出去玩玩"); // 请假的原因// 启动流程实例,第一个参数是流程定义的idProcessInstance processInstance = runtimeService.startProcessInstanceByKey("MyHolidayUI", variables);// 输出相关的流程实例信息System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());System.out.println("流程实例的ID:" + processInstance.getId());System.out.println("当前活动的ID:" + processInstance.getActivityId());}
步骤5:执行任务

一旦流程实例启动,流程引擎会根据流程定义中的逻辑自动执行各个任务。您可以使用Flowable提供的API来查询和完成任务。

  @Testpublic void testCompleteTask() {// 配置数据库相关信息 获取 ProcessEngineConfigurationProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration().setJdbcUrl("jdbc:mysql://ip:3306/flowable?serverTimezone=UTC").setJdbcUsername("root").setJdbcPassword("123456").setJdbcDriver("com.mysql.cj.jdbc.Driver").setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);//获取流程引擎对象ProcessEngine processEngine = cfg.buildProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery().processDefinitionKey("MyHolidayUI").taskAssignee("user2").singleResult();HashMap<String, Object> variables = new HashMap<>();variables.put("approved",true);taskService.complete(task.getId(),variables);}
步骤6:处理流程结果

根据任务的执行结果,您可以继续执行后续的操作,例如生成报告、发送通知等。

在这个过程中 可以查看流程定义 ,可以删除定义,可以看历史记录,可以挂起流程

/*** 查看流程定义*/@Testpublic void testDeployQuery() {// 配置数据库相关信息 获取 ProcessEngineConfigurationProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration().setJdbcUrl("jdbc:mysql://ip:3306/flowable?serverTimezone=UTC").setJdbcUsername("root").setJdbcPassword("123456").setJdbcDriver("com.mysql.cj.jdbc.Driver").setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);ProcessEngine processEngine = cfg.buildProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId("10001").singleResult();System.out.println("processDefinition.getId() = " + processDefinition.getId());System.out.println("processDefinition.getName() = " + processDefinition.getName());System.out.println("processDefinition.getDeploymentId() = " + processDefinition.getDeploymentId());System.out.println("processDefinition.getDescription() = " + processDefinition.getDescription());}
/*** 删除流程定义*/@Testpublic void testDeleteQuery() {ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration().setJdbcUrl("jdbc:mysql://ip:3306/flowable?serverTimezone=UTC").setJdbcUsername("root").setJdbcPassword("123456").setJdbcDriver("com.mysql.cj.jdbc.Driver").setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);ProcessEngine processEngine = cfg.buildProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();repositoryService.deleteDeployment("37501",true);}
@Testpublic void testHistory() {ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration().setJdbcUrl("jdbc:mysql://ip:3306/flowable?serverTimezone=UTC").setJdbcUsername("root").setJdbcPassword("123456").setJdbcDriver("com.mysql.cj.jdbc.Driver").setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);//获取流程引擎对象ProcessEngine processEngine = cfg.buildProcessEngine();HistoryService historyService = processEngine.getHistoryService();List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().processDefinitionId("MyHolidayUI:1:37504").finished()//查询历史记录已经是完成的.orderByHistoricActivityInstanceEndTime() //指定排序的字段和顺序.asc().list();for (HistoricActivityInstance historicActivityInstance : list) {System.out.println(historicActivityInstance.getActivityId() + " took "+ historicActivityInstance.getDurationInMillis() + " milliseconds");}}
/*** 挂起流程*/@Testpublic void test05() {ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration().setJdbcUrl("jdbc:mysql://ip:3306/flowable?serverTimezone=UTC").setJdbcUsername("root").setJdbcPassword("123456").setJdbcDriver("com.mysql.cj.jdbc.Driver").setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);//获取流程引擎对象ProcessEngine processEngine = cfg.buildProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId("MyHolidayUI:1:47504").singleResult();//获取流程定义状态boolean suspended = processDefinition.isSuspended();System.out.println("流程定义状态"+suspended);if(suspended) {System.out.println("激活流程定义");repositoryService.activateProcessDefinitionById("MyHolidayUI:1:47504",true,null);}else {System.out.println("挂起流程");repositoryService.suspendProcessDefinitionById("MyHolidayUI:1:47504",true,null);}}

当我们启动了一个流程实例后,会在ACT_RU_*对应的表结构中操作,运行时实例涉及的表结构共10张:

  • ACT_RU_DEADLETTER_JOB 正在运行的任务表

  • ACT_RU_EVENT_SUBSCR 运行时事件

  • ACT_RU_EXECUTION 运行时流程执行实例

  • ACT_RU_HISTORY_JOB 历史作业表

  • ACT_RU_IDENTITYLINK 运行时用户关系信息

  • ACT_RU_JOB 运行时作业表

  • ACT_RU_SUSPENDED_JOB 暂停作业表

  • ACT_RU_TASK 运行时任务表

  • ACT_RU_TIMER_JOB 定时作业表

  • ACT_RU_VARIABLE 运行时变量表

  启动一个流程实例的时候涉及到的表有

  • ACT_RU_EXECUTION 运行时流程执行实例

  • ACT_RU_IDENTITYLINK 运行时用户关系信息

  • ACT_RU_TASK 运行时任务表

  • ACT_RU_VARIABLE 运行时变量表

ACT_RU_EXECUTION表结构

字段名称备注
ID_主键
REV_版本号
PROC_INST_ID_流程实例ID
BUSINESS_KEY_业务主键ID
PARENT_ID_父执行流的ID
PROC_DEF_ID_流程定义的数据ID
SUPER_EXEC_
ROOT_PROC_INST_ID_流程实例的root流程id
ACT_ID_节点实例ID
IS_ACTIVE_是否存活
IS_CONCURRENT_执行流是否正在并行
IS_SCOPE_
IS_EVENT_SCOPE_
IS_MI_ROOT_
SUSPENSION_STATE_流程终端状态
CACHED_ENT_STATE_
TENANT_ID_租户编号
NAME_
START_TIME_开始时间
START_USER_ID_开始的用户编号
LOCK_TIME_锁定时间
IS_COUNT_ENABLED_
EVT_SUBSCR_COUNT_
TASK_COUNT_
JOB_COUNT_
TIMER_JOB_COUNT_
SUSP_JOB_COUNT_
DEADLETTER_JOB_COUNT_
VAR_COUNT_
ID_LINK_COUNT_

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/661582.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洗地机哪个牌子质量最好?四大爆款品牌推荐

在这个科技日新月异的时代&#xff0c;我们的生活正被无数智能小玩意所改变。它们像是一群神秘的精灵&#xff0c;悄然进入我们的日常&#xff0c;以其独特的魔力&#xff0c;让生活变得更加便捷、舒适。其中&#xff0c;洗地机无疑是近年来最受瞩目的新宠。它犹如一位翩翩起舞…

【17】JAVASE-集合专题【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

【Java EE】多线程(二)Thread 类与常用方法

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

Python图像处理——逐帧读取视频文件的方法

方法1&#xff1a;基于cv2 import cv2 import os import warnings warnings.filterwarnings("ignore") cap cv2.VideoCapture("test/1.mp4") c 1 frameRate 1 # 这里可以修改帧率读取间隔&#xff0c;1就是逐帧读取 path outputs os.makedirs(path)…

Ubuntu安装Neo4j

Ubuntu&#xff08;在线版&#xff09; 更新软件源 sudo apt-get update 添加Neo4j官方存储库 wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - 将地址添加到系统的软件包源列表中 echo deb https://debian.neo4j.com stable latest | su…

飞书API(6):使用 pandas 处理数据并写入 MySQL 数据库

一、引入 上一篇了解了飞书 28 种数据类型通过接口读取到的数据结构&#xff0c;本文开始探讨如何将这些数据写入 MySQL 数据库。这个工作流的起点是从 API 获取到的一个完整的数据&#xff0c;终点是写入 MySQL 数据表&#xff0c;表结构和维格表结构类似。在过程中可以有不同…

Qwen-Audio:推动通用音频理解的统一大规模音频-语言模型(开源)

随着人工智能技术的不断进步&#xff0c;音频语言模型&#xff08;Audio-Language Models&#xff09;在人机交互领域变得越来越重要。然而&#xff0c;由于缺乏能够处理多样化音频类型和任务的预训练模型&#xff0c;该领域的进展受到了限制。为了克服这一挑战&#xff0c;研究…

深入浅出DBus-C++:Linux下的高效IPC通信

目录标题 1. DBus简介2. DBus-C的优势3. 安装DBus-C4. 使用DBus-C初始化和连接到DBus定义接口和方法发送和接收信号 5. dbus-cpp 0.9.0 的安装6. 创建一个 DBus 服务7. 客户端的实现8. 编译和运行你的应用9. 瑞芯微&#xff08;Rockchip&#xff09;的 Linux 系统通常会自带 db…

[C语言]典型例题:小蚂蚁爬橡皮筋、买汽水问题、导致单词块、菱形打印……

1、小蚂蚁爬橡皮筋问题 假设橡皮筋长4m&#xff0c;小蚂蚁从一端爬向另一端每天爬1m&#xff0c;且每爬了1m&#xff0c;橡皮筋会立马拉伸4m&#xff0c;在理想条件下&#xff0c;小蚂蚁需要爬多少天可以到达橡皮筋的另一端&#xff1f; 不仔细想&#xff0c;我们很可能认为小蚂…

【C#】基础知识

0.参考 C#语言入门详解 1.几种打印hello_world的方式 1.1 console控制台 新建一个console&#xff0c;直接打印&#xff1a; Console.WriteLine("Hello_world");启动一闪而过&#xff0c;在vs调试中选择开始执行不调试&#xff08;without debug&#xff09;。 …

基于FPGA的数字信号处理(5)--Signed的本质和作用

前言 Verilog中的signed是一个很多人用不好&#xff0c;或者说不太愿意用的一个语法。因为不熟悉它的机制&#xff0c;所以经常会导致运算结果莫名奇妙地出错。其实了解了signed以后&#xff0c;很多时候用起来还是挺方便的。 signed的使用方法主要有两种&#xff0c;其中一种…

CentOS 环境 JDK 安装

1.jdk下载 &#xff08;1&#xff09;官网Java jdk 历史版本 http://www.oracle.com/technetwork/java/javase/archive-139210.html 选择以下x86 64位版本 &#xff08;2&#xff09;国内 编程宝库 java jdk镜像 地址&#xff1a; http://www.codebaoku.com/jdk/jdk-index…