惊呆了,Spring Boot + Liteflow 居然这么好用!

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

引言

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

每次处理这些流程时,我们都希望能够更简单、高效地进行管理和维护。

这个时候,规则引擎就成了我们的好帮手。

今天,我要和大家分享的是如何利用Spring Boot结合liteflow规则引擎来简化我们的业务流程。

一、什么是liteflow规则引擎?

首先,我们需要了解什么是liteflow。

liteflow是一个轻量级但功能强大的规则引擎。

它支持多种规则文件格式,如XML、JSON等,方便开发者根据自己的需求进行选择。

liteflow可以帮助我们快速编排复杂的业务规则,并实现动态的规则更新。

二、为什么选择liteflow?

其中一个主要原因是它能够快速完成复杂规则的编排。

无论是串行还是并行任务,它都能处理得游刃有余。

而且liteflow支持热部署,这意味着我们可以实时替换或增加节点,而无需重启服务。

三、liteflow组件概览

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

  • 普通组件:集成NodeComponent,用于执行具体的业务逻辑;
  • 选择组件:通过业务逻辑选择不同的执行路径;
  • 条件组件:基于条件返回结果,决定下一步的业务流程。

我们通过代码示例来了解每种组件的用法。

// 普通组件示例
@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格式编写,下面是一个简单的规则文件示例。

<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的配置,指定规则文件的位置;
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中,数据上下文非常重要,它用于参数传递和业务逻辑的执行。

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

@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时,我们需要对一些参数进行配置,如规则文件地址、节点重试、线程池参数等。

以下是一个配置示例。

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

七、实践案例

接下来,我们来看一个完整的业务实践案例。

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

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

1. 引入依赖

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

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

2. 增加配置

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

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文件,编写规则文件内容:

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

4. 编写业务逻辑组件

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

@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的流程来执行积分发放和消息发送的逻辑。

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

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

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

@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在简化业务流程管理方面起到了非常重要的作用,可以提升开发效率和业务流程管理能力。

没用过的xdm,闲暇之余可以自己动手试试哦!

好了,今天的知识你学会了吗?

责任编辑:武晓燕 来源: Java分享客栈
相关推荐

2020-11-11 08:14:42

URL工具类Spring

2015-05-19 14:30:48

加密视频加密亿赛通

2021-07-05 18:05:40

SpringBean方法

2021-03-17 11:47:37

tomcatJavaServerJava

2021-05-28 10:09:22

GC详解Java JVM

2021-11-02 11:31:47

Go代码模式

2021-12-13 22:52:37

iphone iOSHTML

2020-04-02 07:31:53

RPC超时服务端

2015-06-24 16:09:54

Easy Connec深信服

2020-10-31 09:06:37

C语言编程语言

2013-08-09 10:37:31

代码数据

2024-10-11 11:19:05

LiteFlow框架流程

2019-03-28 11:07:56

Spring BootRedis缓存

2022-11-11 09:41:04

连接池微服务数据库

2019-03-04 14:15:43

微软Windows日历

2021-05-07 07:03:33

Spring打包工具

2024-04-02 08:41:10

ArrayListSubList场景

2022-08-01 07:02:06

SpringEasyExcel场景

2016-12-21 12:19:57

AR广告奥迪

2013-12-27 09:46:40

Windows 9Windows 9桌面
点赞
收藏

51CTO技术栈公众号