使用Java动态创建Flowable会签模型


theme: channing-cyan

在企业级应用开发中,工作流管理系统如Flowable扮演着至关重要的角色,特别是在自动化业务流程、任务分配和审批流程设计上。动态创建流程模型,尤其是会签(Parallel Gateway)模型,是提升系统灵活性和响应速度的关键技术之一。本文将通过Java编程语言,深入探讨如何在运行时动态地创建包含会签环节的Flowable流程模型,并部署执行。请注意,以下示例基于Flowable 6.x版本。

1. 环境准备

首先,确保你的开发环境已配置好Flowable依赖。如果你使用Maven,可以在pom.xml中添加如下依赖:

<dependencies><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>${flowable.version}</version></dependency><!-- 其他依赖... -->
</dependencies>

2. 动态模型创建基础

动态创建流程模型主要涉及Flowable的模型API。我们将使用BpmnModelInstance来构建模型,ModelBuilder来定义流程结构。

3. 创建会签流程模型

下面是一个简单的例子,展示如何用Java代码动态创建一个包含开始事件、并行网关(会签)、两个用户任务以及结束事件的基本流程模型。

import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.EndEvent;
import org.flowable.bpmn.model.ParallelGateway;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.SequenceFlow;
import org.flowable.bpmn.model.StartEvent;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.repository.Deployment;// 假设repositoryService已经注入或获取到了
public void createParallelGatewayProcess() {// 创建BpmnModelInstanceBpmnModelInstance modelInstance = Bpmn.createEmptyModel();// 创建流程定义Process process = new Process();process.setId("parallelGatewayProcess");process.setName("Parallel Gateway Example");modelInstance.addProcess(process);// 添加开始事件StartEvent startEvent = modelInstance.newInstance(StartEvent.class);startEvent.setId("startEvent");process.addChildElement(startEvent);// 添加并行网关ParallelGateway parallelGateway = modelInstance.newInstance(ParallelGateway.class);parallelGateway.setId("parallelGateway");process.addChildElement(parallelGateway);// 连接开始事件到并行网关SequenceFlow flow1 = modelInstance.newInstance(SequenceFlow.class);flow1.setId("flow1");flow1.setSource(startEvent);flow1.setTarget(parallelGateway);modelInstance.addFlowElement(flow1);// 添加用户任务1UserTask userTask1 = modelInstance.newInstance(UserTask.class);userTask1.setId("userTask1");userTask1.setName("Task A");process.addChildElement(userTask1);// 添加用户任务2UserTask userTask2 = modelInstance.newInstance(UserTask.class);userTask2.setId("userTask2");userTask2.setName("Task B");process.addChildElement(userTask2);// 从并行网关到两个用户任务SequenceFlow flow2 = modelInstance.newInstance(SequenceFlow.class);flow2.setId("flow2");flow2.setSource(parallelGateway);flow2.setTarget(userTask1);modelInstance.addFlowElement(flow2);SequenceFlow flow3 = modelInstance.newInstance(SequenceFlow.class);flow3.setId("flow3");flow3.setSource(parallelGateway);flow3.setTarget(userTask2);modelInstance.addFlowElement(flow3);// 添加另一个并行网关用于汇聚ParallelGateway joinGateway = modelInstance.newInstance(ParallelGateway.class);joinGateway.setId("joinGateway");joinGateway.setParallelGatewayType(ParallelGateway.Type.DIVERGING); // 设置为汇聚类型process.addChildElement(joinGateway);// 连接两个用户任务到汇聚网关SequenceFlow flow4 = modelInstance.newInstance(SequenceFlow.class);flow4.setId("flow4");flow4.setSource(userTask1);flow4.setTarget(joinGateway);modelInstance.addFlowElement(flow4);SequenceFlow flow5 = modelInstance.newInstance(SequenceFlow.class);flow5.setId("flow5");flow5.setSource(userTask2);flow5.setTarget(joinGateway);modelInstance.addFlowElement(flow5);// 添加结束事件EndEvent endEvent = modelInstance.newInstance(EndEvent.class);endEvent.setId("endEvent");process.addChildElement(endEvent);// 从汇聚网关到结束事件SequenceFlow flow6 = modelInstance.newInstance(SequenceFlow.class);flow6.setId("flow6");flow6.setSource(joinGateway);flow6.setTarget(endEvent);modelInstance.addFlowElement(flow6);// 部署流程模型RepositoryService repositoryService = /* 获取RepositoryService */;Deployment deployment = repositoryService.createDeployment().addModelInstance("parallelGatewayExample.bpmn", modelInstance).name("Parallel Gateway Example Process").deploy();System.out.println("流程已部署,部署ID: " + deployment.getId());
}

4. 执行与测试

部署完成后,你就可以通过Flowable的RuntimeService启动该流程实例,并通过TaskService处理用户任务了。记得在实际应用中捕获可能的异常,并进行相应的错误处理。

5. 总结

本文介绍了如何使用Java动态创建一个含有并行网关(会签)的Flowable流程模型。通过这种方式,你可以根据业务需求灵活地调整流程结构,而无需预先设计并部署流程定义文件。这极大地增强了系统的适应性和可维护性。实践过程中,还可以进一步探索如何结合表单、变量、监听器等高级特性,以实现更复杂的工作流逻辑。

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

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

相关文章

大模型LLM:最清晰解读提示工程(Prompt Engineering)

提示工程&#xff08;Prompt Engineering&#xff09;&#xff0c;也称为上下文提示&#xff0c;是一种通过不更新模型的权重/参数来引导LLM行为朝着特定结果的方法。这是与AI有效交流所需结果的过程。提示工程可以用于各种任务&#xff0c;从回答问题到算术推理乃至各种应用领…

【触摸案例-手势解锁案例-按钮高亮 Objective-C语言】

一、我们来说这个self.btns,这个问题啊,为什么不用_btns, 1.我们说,在懒加载里边儿,经常是写下划线啊,_btns,为什么不写,首先啊,这个layoutSubviews:我们第一次,肯定会去执行这个layoutSubviews: 然后呢,去懒加载这个数组, 然后呢,接下来啊,走这一句话, 第一次…

邮件系统国产化,保障企业信息安全的重要举措

随着信息技术日益发展和成熟&#xff0c;企业信息化建设深入推进&#xff0c;企业信息化管理能力大幅提升&#xff0c;其中邮件系统在企业信息化建设中扮演着至关重要的角色。然而&#xff0c;长期以来&#xff0c;我国企业在邮件系统方面主要依赖于国外的产品&#xff0c;这不…

win11安装SQL Server 2012 企业版

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、硬件要求二、软件安装参考&#xff1…

C语言---操作符详解

1.操作符的分类 • 算术操作符&#xff1a; 、- 、* 、/ 、% • 移位操作符: > • 位操作符: & | ^ • 赋值操作符: 、 、 - 、 * 、 / 、% 、> 、& 、| 、^ • 单⽬操作符&#xff1a; &#xff01;、、--、&、*、、-、~ 、sizeof、(类型) • 关系操…

在windows下使用VS Code、CMake、Make进行代码编译

软件环境 Windows11VS CodeNoneCMake3.26.4-windows-x86_64MinGWNone 电脑系统配置 安装MinGW将MinGW安装文件夹中bin文件夹下的mingw32-make.exe复制并重命名为make.exe在文件夹中添加系统路径&#xff0c;具体位置为 系统->系统信息->高级系统设置->高级->环境…

Linux运维:centos环境变量

前言 在 Linux 运维工作中&#xff0c;管理环境变量是至关重要的一项任务。在 CentOS 环境下&#xff0c;正确配置环境变量可以使系统更加高效和易于管理。 本文将重点讨论 CentOS 环境下的环境变量设置&#xff0c;并就python的环境变量配置方案进行讲解&#xff08;不包含Ano…

生成式 AI 的发展方向,应当是 Chat 还是 Agent?

生成式AI的发展方向既可以是Chat&#xff08;聊天&#xff09;也可以是Agent&#xff08;智能代理&#xff09;&#xff0c;这两者并不是互斥的&#xff0c;而是可以相互补充和融合。 Chat&#xff08;聊天&#xff09;方向&#xff1a; 聊天机器人在过去几年中取得了显著的进…

cs客户端测试注意点

客户端安装卸载测试 安装测试 1、GUI测试&#xff1a;安装过程中所有的界面显示&#xff0c;提示信息等是否正确 2、兼容性测试&#xff1a;在不同的操作系统&#xff0c;不同配置的主机上能否正常安装 3、安装路径测试(软件不能自动安装的情况下)&#xff1a; 软件默认路…

YOLOv9中模块总结补充|SPPELAN

专栏相关代码&#xff1a;目前售价售价69.9&#xff0c;改进点80 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 1. SPPELAN SPPELAN是YOLOv9作者在SPPF的基础上创新的模块&#xff08;增加了一次…

基于STM32F401RET6智能锁项目(环境搭建)

工程搭建 MDK&#xff0c;固件库&#xff0c;芯片包下载 下载keil5&#xff0c;stm32f4xx的固件库以及stm32f4的芯片包 keil官网&#xff1a;https://www2.keil.com/mdk5/ stm32中国官网&#xff1a;https://www.stmcu.com.cn/ 创建工程 1、新建一个工程文件夹&#xff0c;…

【勘误】一个错误的快速排序实现

文章目录 问题一&#xff1a;不一致算法描述部分给出的分划实现完整程序部分给出的分划实现 问题二&#xff1a;不正确问题三&#xff1a;把循环条件改为 i < j 程序还是不正确正确的实现总结 从 10 10 10 年前我开始学 C 语言时我就认为快速排序并不是个简单的算法。相比于…

系统权限控制插件封装-实现系统权限控制插件化

背景&#xff1a;按照传统的开发方式方式&#xff0c;每次新开发一个系统&#xff0c;就需要花费大量时间精力去搭建权限控制模块&#xff0c;如果我们把权限控制这一整个模块都抽离成一个独立的权限控制插件&#xff0c;支持单命令安装&#xff0c;全面暴露参数与方法&#xf…

k8s 理论知识基本介绍

目录 一 k8s 理论前言 &#xff08;一&#xff09;微服务是什么 1&#xff0c;应用场景 2&#xff0c;API 是什么 &#xff08;二&#xff09;&#xff0c;微服务 如何做版本迭代 1. Docker镜像构建 2. 版本标记 3. Docker Registry 4. 环境一致性 5. 滚动更新…

美国海军部发布《海军科学与技术战略》

文章目录 前言一、战略目标二、美海军部科学与技术战略总体归纳(一)强化海上统治地位1、实现更快的技术收益2、应用颠覆性技术3、发挥海军部战略优势4、完善试验和兵棋推演机制(二)建立卓越战斗文化1、打造集合作战人员、科学家和工程师的团队2、强化合作和建设能力3、科学…

多进程编程

创建一对父子进程&#xff1a; 父进程负责向文件中写入 长方形的长和宽 子进程负责读取文件中的长宽信息后&#xff0c;计算长方形的面积 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #inc…

串口通信---了解

1 串口接线方式 RXD&#xff1a;数据输入引脚&#xff0c;数据接受&#xff1b;STC89系列对应P3.0口 TXD&#xff1a;数据发送引脚&#xff0c;数据发送&#xff1b;STC89系列对应P3.1口 接线方式 串口编程要素 输入/输出数据缓冲器叫做SBUF&#xff0c;都用99H地址码&#x…

Java文件与IO操作

1. 文件与IO操作 1.1 文件 什么是文件: 文件,对我们并不陌生,文件是保存数据的地方,比如大家经常使用的word文档,txt文件.excel文件...都是文件。它既可以保存一张图片,也可以保持视频,声音.… 1.1.1 文件流: 1.1.2 常用的文件操作: 创建文件对象相关构造器和方法: 案例&a…

NeRF算法

目录 算法介绍 基本原理 1. 体渲染 2. 多层感知机&#xff08;MLP&#xff09; 3. 位置编码 4. 两阶段层次化体采样 实验展示 代码解析 算法介绍 NeRF&#xff08;Neural Radiance Fields&#xff09;是一种用于从2D图像中重建3D场景的神经网络模型。它通过训练一个深度…

SAP-ABAP-视图

1、什么是视图&#xff1f; 当需要查询多个表中的某些字段的数据时&#xff0c;就可以使用视图。视图不影响数据库中的数据&#xff0c;仅作为查询手段或工具。 2、视图类型&#xff1a; 数据库视图和维护视图经常使用。 3、创建视图SE11 3.1、数据库视图 可以直接输入表名…