当前位置: 首页 > article >正文

使用LiteFlow实现阻塞审批工作流

在 LiteFlow 中实现阻塞的审批工作流,你可以使用异步处理与同步逻辑结合,实现节点的等待

使用 LiteFlow 实现阻塞审批工作流

下面是如何实现一个带有阻塞审批功能的 LiteFlow 工作流示例。

1. 引入依赖

确保您的 pom.xml 文件中已引入 LiteFlow 和 Spring Boot 的相关依赖:

<dependency><groupId>com.yomahub</groupId><artifactId>liteflow-spring-boot-starter</artifactId><version>2.13.0</version> <!-- 请根据需要调整版本 -->
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.0</version> <!-- 请根据需要调整版本 -->
</dependency>
2. 创建工作流节点

在审批节点中,我们可以使用 Java 的 CountDownLatchBlockingQueue 来实现阻塞,模拟等待用户审批的过程。

import com.yomahub.liteflow.core.NodeComponent;
import java.util.concurrent.CountDownLatch;public class ApprovalNode extends NodeComponent {// 创建一个 CountDownLatch,用于阻塞private static final CountDownLatch latch = new CountDownLatch(1);@Overridepublic void process() {System.out.println("正在等待审批...");try {// 在这里模拟一个阻塞操作,例如等待用户的审批latch.await(); // 阻塞等待,直到 latch.countDown() 被调用System.out.println("审批通过,继续处理");} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 重置中断状态System.out.println("审批被中断");}}// 模拟审批通过的方法,可以在外部调用public static void approve() {latch.countDown(); // 释放阻塞}
}public class NotifyNode extends NodeComponent {@Overridepublic void process() {System.out.println("通知节点处理逻辑");}
}public class FinalNode extends NodeComponent {@Overridepublic void process() {System.out.println("最终处理节点逻辑");}
}
3. 配置工作流

src/main/resources 目录下创建一个 liteflow.xml 文件,内容如下:

<liteflow><chain id="approvalChain">THEN(approvalNode, notifyNode, finalNode);</chain>
</liteflow>
4. 控制器实现审批

我们可以通过 Spring Controller 来模拟用户审批。在这里,我们提供一个 REST API 用于批准审批。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ApprovalController {@GetMapping("/approve")public String approve() {ApprovalNode.approve(); // 调用静态方法释放阻塞return "审批已通过";}
}
5. 主程序

使用 Spring Boot 启动应用程序并执行工作流。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.yomahub.liteflow.core.FlowExecutor;import javax.annotation.Resource;@SpringBootApplication
public class LiteFlowDemoApplication {@Resourceprivate FlowExecutor flowExecutor;public static void main(String[] args) {SpringApplication.run(LiteFlowDemoApplication.class, args);}@PostConstructpublic void runFlow() {CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {try {flowExecutor.execute("approvalChain");} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 恢复中断状态System.err.println("Task was interrupted.");} catch (Exception e) {System.out.println("工作流执行出错: " + e.getMessage());}}); // 在新线程中启动工作流//可以在这里处理 future 的结果或异常future.exceptionally(ex -> {System.err.println("异步任务执行失败: " + ex.getMessage());return null;});}}

6. 启动项目

在 IDE 中运行 LiteFlowDemoApplication 类。启动后,您可以通过浏览器或 Postman 访问 http://localhost:8080/approve 来模拟审批操作。

7. 访问审批接口

  1. 启动应用后,您会在控制台看到输出:“正在等待审批…”
  2. 访问 http://localhost:8080/approve,您将收到 “审批已通过” 的响应,同时控制台输出 “审批通过,继续处理”,接着通知节点和最终处理节点也会输出相应的内容。

小结

通过上述步骤,您实现了一个阻塞的审批工作流。审批节点在等待用户审批时将处于阻塞状态,直到外部接口被调用以批准审批。这种方法可以很好地模拟真实的审批流程,您可以根据实际需要扩展和修改。

如果您有更多问题或需要更复杂的功能示例,请随时询问!

相关文章:

使用LiteFlow实现阻塞审批工作流

在 LiteFlow 中实现阻塞的审批工作流&#xff0c;你可以使用异步处理与同步逻辑结合&#xff0c;实现节点的等待 使用 LiteFlow 实现阻塞审批工作流 下面是如何实现一个带有阻塞审批功能的 LiteFlow 工作流示例。 1. 引入依赖 确保您的 pom.xml 文件中已引入 LiteFlow 和 S…...

2025移动端软件供应链安全开源治理方案最佳实践

2025年3月13日&#xff0c;由中国软件评测中心、CAPPVD漏洞库联合主办的“第六期移动互联网APP产品安全漏洞技术沙龙”在海口成功召开。悬镜安全基于移动端数字供应链安全开源治理方案荣获中国软件评测中心“2024移动互联网APP产品安全漏洞治理”优秀案例&#xff0c;并获颁证书…...

Git Fast-forward 合并详解:原理、场景与最佳实践

在使用 Git 进行团队协作时&#xff0c;我们经常需要合并分支。合并方式有很多种&#xff0c;其中 Fast-forward&#xff08;快速合并&#xff09; 是一种最简单且无冲突的合并方式。本文将详细介绍 Fast-forward 的原理、适用场景、常见问题及最佳实践。 一、Fast-forward 合并…...

《C#上位机开发从门外到门内》2-3:SPI总线协议详解及应用实践

文章目录 一、引言二、SPI总线协议的基本原理三、SPI通信模式详解 —— CPOL与CPHA3.1 时钟极性&#xff08;CPOL&#xff09;3.2 时钟相位&#xff08;CPHA&#xff09;3.3 四种SPI模式 四、主从设备通信机制4.1 通信流程概述4.2 数据帧结构与传输细节4.3 主设备与从设备的协同…...

vscode出现:No module named ‘requests‘ 问题的解决方法

问题&#xff1a; ① No module named requests ② pip install requests&#xff1a;显示已经安装成功 运行失败原因&#xff1a; 我的失败原因是因为&#xff1a;我的python环境有两个&#xff0c;电脑C盘默认一个、pycharm下载后在它的路径下有一个。而vscode所运行的环境…...

【openwebui 搭建本地知识库(RAG搭建本地知识库)】

安装准备 openwebui 这个本地安装之前写过使用python安装。也可以直接用docker 命令 docker run --rm -d \-p 3080:8080 \-p 3081:8081 \-e WEBUI_AUTHtrue \-e DEFAULT_LOCALEcn \-e GLOBAL_LOG_LEVEL"INFO" \-e AIOHTTP_CLIENT_TIMEOUT100 \--privilegedtrue \-…...

Docker Compose 使用笔记

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具&#xff1b; docker-compose.yml 文件则是 Docker Compose 用来配置应用服务的核心文件&#xff0c;它以 YAML 格式编写。 YAML 文件用途&#xff1a; 服务定义&#xff1a;在 docker-compose.yml 文件中&…...

雷池WAF 处理 HTTP 请求的流程

项目介绍 SafeLine&#xff0c;中文名 "雷池"&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、…...

JAVA-Thread类实现多线程

引言&#xff1a; 本章博客涉及进程线程内容&#xff0c;如果不了解的可以看&#xff1a;什么是进程线程-CSDN博客 线程是操作系统的概念&#xff0c;操作系统提供的API供程序员使用操作。但是不同的操作系统(Winodws、Linux、Unix……差别很大),但是做为JAVA程序员就不需要担心…...

【算法】DFS、BFS、拓扑排序

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;算法 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 持续更新中...1、DFS2、BFSN 叉树的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度 3、多源BFS腐烂的苹果 4、拓扑排序 持续更新中…...

MySQL中 IN 到底走不走索引?

文章目录 前言数据库表结构查询sqlEXPLAIN介绍EXPLAIN 的输出每列解释 强制走索引查询时添加条件(复合索引字段)查询小时查询分钟 总结 前言 在 MySQL 中&#xff0c;IN 语句是否能够利用索引取决于多个因素&#xff0c;包括但不限于查询的具体形式、表的统计信息、索引的选择…...

centos没有ll

vi /etc/bashrc alias ll‘ls -l’ source /etc/bashrc...

腾讯云低代码开发应用

创建客户端应用 如上所示&#xff0c;登录腾讯云微搭低代码业务控制台&#xff0c;开始搭建企业官网应用 如上所示&#xff0c;在腾讯云微搭低代码业务控制台中&#xff0c;开始创建企业官网应用 如上所示&#xff0c;在腾讯云微搭低代码业务控制台中&#xff0c;开始编辑企业官…...

医疗APP开发如何实现跨机构数据互通

医疗APP开发如何实现跨机构数据互通 在数字化医疗时代,医疗APP开发已成为连接医疗机构、患者和医疗资源的重要桥梁。然而,如何实现跨机构的数据互通,成为医疗APP开发中的一大挑战。本文将探讨如何通过医疗APP开发实现跨机构数据互通,提升医疗服务效率和患者体验。我们将涵…...

深度学习项目--基于DenseNet网络的“乳腺癌图像识别”,准确率90%+,pytorch复现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 如果说最经典的神经网络&#xff0c;ResNet肯定是一个&#xff0c;从ResNet发布后&#xff0c;很多人做了修改&#xff0c;denseNet网络无疑是最成功的…...

级联树SELECTTREE格式调整

步骤&#xff1a; 1、将全部列表设置成Map<Long, List<Obejct>> map的格式&#xff0c;方便查看每个父级对应的子列表&#xff0c;减少循环次数 2、对这个map进行递归&#xff0c;重新进行级联树的集合调整&#xff0c;将子集放置在对应的childs里面。 public Dyna…...

编译RTTR 0.9.6 (CMake + vs2019)解决std::iterator对rapidjson编译事项

RTTR编译 使用CMake和VS2019 x64编译RTTR 0.9.6指南一、下载RTTR 0.9.6并配置CMake二、在VS2019上编译RTTR 0.9.6解决rapidjson与C17兼容性问题 三、安装RTTR四、最简单的还是用vcpkg 使用CMake和VS2019 x64编译RTTR 0.9.6指南 本文将指导您完成从下载RTTR 0.9.6到使用CMake生…...

深入理解JavaScript构造函数与原型链:从原理到最佳实践

一、开篇&#xff1a;为什么需要理解原型链&#xff1f; 在JavaScript开发中&#xff0c;90%以上的"诡异"bug都与原型链机制相关。理解构造函数与原型链的运行原理&#xff0c;不仅能帮助我们写出更优雅的代码&#xff0c;还能在框架源码阅读、性能优化等场景中游刃…...

【Linux 指北】常用 Linux 指令汇总

第一章、常用基本指令 # 注意&#xff1a; # #表示管理员 # $表示普通用户 [rootlocalhost Practice]# 说明此处表示管理员01. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xf…...

第27周JavaSpringboot 前后端联调

电商前后端联调课程笔记 一、项目启动与环境搭建 1.1 项目启动 在学习电商项目的前后端联调之前&#xff0c;需要先掌握如何启动项目。项目启动是整个开发流程的基础&#xff0c;只有成功启动项目&#xff0c;才能进行后续的开发与调试工作。 1.1.1 环境安装 环境安装是项…...

QT中的布局管理

在 Qt 中&#xff0c;布局管理器&#xff08;如 QHBoxLayout 和 QVBoxLayout&#xff09;的构造函数可以接受一个 QWidget* 参数&#xff0c;用于指定该布局的父控件。如果指定了父控件&#xff0c;布局会自动将其管理的控件添加到父控件中。 在你的代码中&#xff0c;QHBoxLa…...

.net 6.0 webapi支持 xml返回xml json返回json

// 添加控制器并配置格式化器 var builder WebApplication.CreateBuilder(); builder.Services.AddControllers(options > {options.Filters.Add<ContentTypeFilter>();options.ReturnHttpNotAcceptable true; // 强制要求Accept头匹配// 添加 XML 格式化器options.…...

docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境

docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境 docker-compose.yml services:mysql-8.0:container_name: mysql-8.0image: mysql:8.0restart: always#ports:#- "3306:3306"volumes:- ./etc/mysql/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro- ./var/log…...

Android7上移植I2C-tools

一&#xff0c;下载源码 cd hardware/libhardware/tests git clone https://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git 二&#xff0c; 在 i2c-tools 目录添加 Android.mk 编译文件 LOCAL_PATH: $(call my-dir)################### i2c-tools ###############…...

Centos 7 修改语言和输入源为中文+修改终端快捷键复制为Ctrl+C、粘贴为Ctrl+V

目录 修改语言和输入源为中文 1、设置 2、Region & Language&#xff08;区域和语言&#xff09; 3、Add an Input Source&#xff08;添加输入源&#xff09; 4、修改语言为中文 5、Restart&#xff08;重启&#xff09; 6、Log Out &#xff08;注销&#xff09; …...

DeepSeek-进阶版部署(Linux+GPU)

前面几个小节讲解的Win和Linux部署DeepSeek的比较简单的方法&#xff0c;而且采用的模型也是最小的&#xff0c;作为测试体验使用是没问题的。如果要在生产环境使用还是需要用到GPU来实现&#xff0c;下面我将以有一台带上GPU显卡的Linux机器来部署DeepSeek。这里还只是先体验单…...

疯狂安卓入门,crayandroid

系列文章目录 文章目录 系列文章目录第一组 ViewGroup 为基类帧布局约束布局 第二组 TextView 及其子类button时钟 AnalogClock 和 TextClock计时器 第三组 ImageView 及其子类第四组 AdapterView 及其子类AutoCompleteTextView 的功能和用法ExapndaleListViewAdapterViewFlipp…...

批量测试IP和域名联通性

最近需要测试IP和域名的联通性&#xff0c;因数量很多&#xff0c;单个ping占用时间较长。考虑使用Python和Bat解决。考虑到依托的环境&#xff0c;Bat可以在Windows直接运行。所以直接Bat处理。 方法1 echo off for /f %%i in (E:\封禁IP\ipall.txt) do (ping %%i -n 1 &…...

Python——计算机网络

一.ip 1.ip的定义 IP是“Internet Protocol”的缩写&#xff0c;即“互联网协议”。它是用于计算机网络通信的基础协议之一&#xff0c;属于TCP/IP协议族中的网络层协议。IP协议的主要功能是负责将数据包从源主机传输到目标主机&#xff0c;并确保数据能够在复杂的网络环境中正…...

一招解决Pytorch GPU版本安装慢的问题

Pytorch是一个流行的深度学习框架&#xff0c;广泛应用于计算机视觉、自然语言处理等领域。安装Pytorch GPU版本可以充分利用GPU的并行计算能力&#xff0c;加速模型的训练和推理过程。接下来&#xff0c;我们将详细介绍如何在Windows操作系统上安装Pytorch GPU版本。 查看是否…...