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

Spring Boot + liteflow 居然这么好用!实战

在我们的日常开发中,经常会遇到一些需要串行并行处理的复杂业务流程。

那我们该如何利用Spring Boot结合liteflow规则引擎来简化我们的业务流程

先看一个实战案例!!

在电商场景下,当订单完成后,我们需要同时进行积分发放和消息发送。

这时候,我们可以利用liteflow进行规则编排,处理这些并行任务。

1. 引入依赖

首先,在pom.xml文件中添加liteflow的依赖:

 

xml

<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.6.5</version>
</dependency>

2. 增加配置

application.yml文件中添加liteflow的配置:

 

yaml

spring:
application:
name: liteflow-demo

liteflow:
rule-source: "classpath:flow.xml" # 指定规则文件的位置
node-retry: 3 # 节点重试次数
thread-executor:
core-pool-size: 10 # 线程池核心线程数
max-pool-size: 20 # 线程池最大线程数
keep-alive-time: 60 # 线程存活时间

3. 编写规则文件

resources目录下创建flow.xml文件,编写规则文件内容:

 

xml

<flow>
<parallel>
<node id="pointNode"/>
<node id="messageNode"/>
</parallel>
</flow>

4. 编写业务逻辑组件

按照规则文件中的定义,编写相应的业务逻辑组件:

 

java

@LiteflowComponent("pointNode")
public class PointNode extends NodeComponent {
@Override
public void process() throws Exception {
// 发放积分逻辑
System.out.println("Issuing points for the order");
}
}

@LiteflowComponent("messageNode")
public class MessageNode extends NodeComponent {
@Override
public void process() throws Exception {
// 发送消息逻辑
System.out.println("Sending message for the order");
}
}

5. 流程触发

当订单完成后,我们需要触发liteflow的流程来执行积分发放和消息发送的逻辑。

我们可以在订单完成的服务方法中添加如下代码:

 

java

@Service
public class OrderService {

@Autowired
private FlowExecutor flowExecutor;

public void completeOrder(Order order) {
// 完成订单的其他逻辑
System.out.println("Order completed: " + order.getId());

// 执行liteflow流程
flowExecutor.execute2Resp("flow", order);
}
}

在上述代码中,我们使用FlowExecutor来执行liteflow流程,并将订单对象传递给流程。

这将触发flow.xml中定义的规则,执行并行的积分发放和消息发送逻辑。

性能统计

liteflow在启动时完成规则解析和组件注册,保证高性能的同时,还能统计各业务环节的耗时,帮助我们进行性能优化。

以下是一个性能统计示例:

 

java

@LiteflowComponent("performanceNode")
public class PerformanceNode extends NodeComponent {
@Override
public void process() throws Exception {
long start = System.currentTimeMillis();
// 业务逻辑
long end = System.currentTimeMillis();
System.out.println("PerformanceNode execution time: " + (end - start) + "ms");
}
}

liteflow组件概览

liteflow中,主要有以下几种组件:

  • 普通组件:集成NodeComponent,用于执行具体的业务逻辑;

  • 选择组件:通过业务逻辑选择不同的执行路径;

  • 条件组件:基于条件返回结果,决定下一步的业务流程。

 

java

// 普通组件示例
@LiteflowComponent("commonNode")
public class CommonNode extends NodeComponent {
@Override
public void process() throws Exception {
// 业务逻辑
System.out.println("Executing commonNode logic");
}
}

// 选择组件示例
@LiteflowComponent("choiceNode")
public class ChoiceNode extends NodeSwitchComponent {
@Override
public String processSwitch() throws Exception {
// 根据条件返回不同的节点ID
return "nextNodeId";
}
}

// 条件组件示例
@LiteflowComponent("conditionNode")
public class ConditionNode extends NodeIfComponent {
@Override
public boolean processIf() throws Exception {
// 判断条件
return true;
}
}

EL规则文件

liteflow中,规则文件可以采用XML格式编写,下面是一个简单的规则文件示例。

 

xml

<flow>
<node id="commonNode"/>
<if id="conditionNode">
<true-to id="nextNode"/>
<false-to id="otherNode"/>
</if>
<switch id="choiceNode">
<case id="case1" to="node1"/>
<case id="case2" to="node2"/>
</switch>
</flow>

如何使用EL规则文件
  1. 创建规则文件:将上述规则文件保存为flow.xml,放在项目的resources目录下;

  2. 配置liteflow:在Spring Boot项目中添加liteflow的配置,指定规则文件的位置;

 

yaml

liteflow:
rule-source: "classpath:flow.xml"
node-retry: 3
thread-executor:
core-pool-size: 10
max-pool-size: 20
keep-alive-time: 60

  1. 编写业务逻辑组件:按照规则文件中的定义,编写相应的组件逻辑。

数据上下文

liteflow中,数据上下文非常重要,它用于参数传递业务逻辑的执行。

我们可以通过以下代码示例了解数据上下文的用法。

 

java

@LiteflowComponent("contextNode")
public class ContextNode extends NodeComponent {
@Override
public void process() throws Exception {
// 获取数据上下文
LiteflowContext context = this.getContextBean();
// 设置数据
context.setData("key", "value");
// 获取数据
String value = context.getData("key");
System.out.println("Context data: " + value);
}
}

配置详解

在使用liteflow时,我们需要对一些参数进行配置,如规则文件地址、节点重试、线程池参数等。

以下是一个配置示例。

 

yaml

liteflow:
rule-source: "classpath:flow.xml" # 指定规则文件的位置
node-retry: 3 # 节点重试次数
thread-executor:
core-pool-size: 10 # 线程池核心线程数
max-pool-size: 20 # 线程池最大线程数
keep-alive-time: 60 # 线程存活时间

总的来说,liteflow在简化业务流程管理方面起到了非常重要的作用,可以提升开发效率和业务流程管理能力。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微服务架构设计与实现:Java开发者视角
  • MySQL/SqlServer 跨服务器 增删改查(CRUD) 的一种方法
  • 如何使用深度学习进行实时目标检测:速度与精度的双重挑战
  • html+js+css在线倒计时
  • llamaindex实战-使用本地大模型和数据库对话
  • 政策护航新能源助推绿色经济腾飞
  • 需求预测算法面试
  • pycharm如何使用jupyter
  • 什么是断路器模式?Hystrix在其中扮演什么角色?
  • 党员教育和管理系统的设计与实现
  • 本地部署 fish-speech
  • [程序员] gnu: binutils:addr2line 结果显示很多问号?
  • 【数据结构】(6.3)堆的应用——堆排序(C语言)
  • 问题集锦1
  • Java中初始化一个List的多种方式
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Android Studio:GIT提交项目到远程仓库
  • bearychat的java client
  • CODING 缺陷管理功能正式开始公测
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java 最常见的 200+ 面试题:面试必备
  • Laravel Telescope:优雅的应用调试工具
  • Shell编程
  • 从tcpdump抓包看TCP/IP协议
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 深入浅出webpack学习(1)--核心概念
  • 十年未变!安全,谁之责?(下)
  • 新手搭建网站的主要流程
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • #微信小程序(布局、渲染层基础知识)
  • (9)STL算法之逆转旋转
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (Forward) Music Player: From UI Proposal to Code
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (windows2012共享文件夹和防火墙设置
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (五)Python 垃圾回收机制
  • (一)80c52学习之旅-起始篇
  • (已解决)什么是vue导航守卫
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)一些感悟
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .Net各种迷惑命名解释
  • .NET序列化 serializable,反序列化