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

使用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);

    @Override
    public 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 {
    @Override
    public void process() {
        System.out.println("通知节点处理逻辑");
    }
}

public class FinalNode extends NodeComponent {
    @Override
    public 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 {

    @Resource
    private FlowExecutor flowExecutor;

    public static void main(String[] args) {
        SpringApplication.run(LiteFlowDemoApplication.class, args);
    }

    @PostConstruct
    public 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,您将收到 “审批已通过” 的响应,同时控制台输出 “审批通过,继续处理”,接着通知节点和最终处理节点也会输出相应的内容。

小结

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

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

http://www.dtcms.com/a/67289.html

相关文章:

  • 前端面试:React hooks 调用是可以写在 if 语句里面吗?
  • JavaScript性能优化实战指南
  • 软件工程概述、软件过程模型、逆向工程(高软45)
  • HTML5拼图游戏开发经验分享
  • Pycharm(五)序列的操作
  • 网络VLAN技术详解:原理、类型与实战配置
  • Elasticsearch Java High Level Client [7.17] 使用
  • K8S学习之基础二十八:k8s中的configMap
  • Interview preparation.md
  • RabbitMQ从入门到实战-知识详情总结
  • 2024下半年真题 系统架构设计师 论文写作 答案解析
  • 基于全局分析SpringCloud各个组件所解决的问题?
  • 框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
  • 证券交易系统的流程
  • T2.小牛架炮 - 美团机试真题题解
  • qt c++线程中的同步和异步
  • Linux入门 全面整理终端 Bash、Vim 基础命令速记
  • Python----数据可视化(pyecharts二:绘图一:条形图,直方图,折线图,散点图,箱图,饼图,热力图)
  • HarmonyOS第21天:解锁分布式技术,开启跨设备协同新体验
  • Mac如何查看 IDEA 的日志文件
  • nginx部署使用【常用命令】
  • Qt 初识1.1
  • 时间有限,如何精确设计测试用例?5种关键方法
  • LINUX下的tcp协议
  • 用SpringBoot做一个web小案例环境搭建
  • 《Android Glide 深度解析:工作原理、LRU 缓存机制与最佳实践》
  • 设计模式Python版 模板方法模式(下)
  • 高效集成聚水潭采购退货数据到MySQL的最佳实践
  • 4-文件导入功能文档
  • 零成本本地化搭建开源AI神器LocalAI支持CPU推理运行部署方案