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

【Java】IDEA从零到一使用statemachine状态机模拟订单 (图解)

Java系列文章目录

补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史


文章目录

  • Java系列文章目录
  • 一、前言
  • 二、学习内容:
  • 三、问题描述
  • 四、解决方案:
    • 4.1 认识依赖
    • 4.2 使用状态机
      • 4.2.1 目录结构
      • 4.2.2 状态机解析
        • 4.2.2.1 概念
        • 4.2.2.2 图解
        • 4.2.2.3 拓展内容
  • 五、总结:

一、前言

  • 学会操作并使用状态机
  • 这是初步学会使用,详细实践部分下篇文章讲

二、学习内容:

  • 使用statemachine实现类似订单的基本功能

三、问题描述

  • 顺序不同无法继续状态机

四、解决方案:

4.1 认识依赖

<!--状态机依赖-->
<dependency>
    <groupId>org.springframework.statemachine</groupId>
    <artifactId>spring-statemachine-core</artifactId>
    <version>4.0.0</version>
</dependency>

🌟 引入状态机功能

4.2 使用状态机

4.2.1 目录结构

  • 记得引入状态机依赖

在这里插入图片描述

4.2.2 状态机解析

4.2.2.1 概念

用于构建状态机的框架,能够帮助开发者设计和实现不同状态的转换和管理

主要内容如下:

状态(State):

  • 表示系统的某个特定 condition 或阶段。状态可以是简单状态、复合状态或并发状态。

事件(Event):

  • 触发状态转换的外部或内部事件。事件是状态机运行的驱动力

状态转换(Transition):

  • 从一个状态到另一个状态的变化。状态转换通常是由特定事件触发的

状态机配置(State Machine Configuration):

  • 定义状态、事件和转换的规则,通常是在一个配置类中使用Java或DSL进行配置。

动作(Action):

  • 状态转换时可能执行的操作。可以在进入状态、退出状态或转换时执行。

监听器(Listener):

  • 用于监听状态机状态和事件的变化,并可以在发生变化时做出相应的处理
4.2.2.2 图解
  • 我们以PAY事件举例,具体要注意的已经在图中展示

在这里插入图片描述

  • 先设置枚举类包含状态与事件
  • 配置状态机事件的状态规则(左边)
  • 再配置事件的动作(右边)

🌟 事件是状态机运行的驱动力

调用事件:
在这里插入图片描述
执行顺序按规则来即可成功

结果如下:
在这里插入图片描述

🌟 事件顺序必须按照状态机配置里面的规则才能成功

4.2.2.3 拓展内容

大致内容如下,想要详细点下篇文章具体讲

  • 思考如果有多个订单过来怎么区分呢

  • 可以使用setHeader具体区分不同订单

参考代码:

@PostMapping("pay")
public void payOrders(@RequestBody Orders orders) {
    Message<Events> message = MessageBuilder.withPayload(Events.PAY)
            .setHeader("orderId", orders.getId()) // 设置订单ID
            .setHeader("orders", orders)
            .build();
    boolean event = stateMachine.sendEvent(message);

    if (event) {
        // 获取状态机当前状态
        Status currentState = stateMachine.getState().getId();

        // 检查当前状态是否为 PAID
        if (currentState.equals(Status.PAID)) {
            // 使用订单ID更新订单状态
            ordersService.updateOrderStatus(orders.getId(), Status.PAID);
        }
    }

    log.info("支付事件被发送了....返回:{}", event);
}
  • 如果所有流程走完怎么重置呢
status.withStates()
        .initial(Status.STANDBY)
        .state(Status.UNPAID)
        .state(Status.PAID)
        .end(Status.FINISHED);

五、总结:

确保每一步按配置规定走

🌟 顺序错误动作执行不了,那么前端无法干扰状态机运行

  • 设置事件的规则
  • 设置事件的动作
  • 调用事件

(后续有遇到问题再添加)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

在这里插入图片描述


http://www.kler.cn/a/287626.html

相关文章:

  • 帧中继原理与配置
  • 工厂模式-简单工厂模式
  • linux虚拟机无法使用yum在线拉取
  • java小练习
  • 从零开始学习 sg200x 多核开发之 uboot saveenv 功能使能
  • 【Golang】——Gin 框架中的路由与请求处理
  • 9月2日记
  • 【Transformer】基本概述
  • iPhone出现4013错误的和解决方案分享
  • AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.08.10-2024.08.15
  • 使用twilio向手机发短信做监控报警
  • 算法之哈希表
  • 地级市地理相邻矩阵(地级市名称版、行政区划代码版)
  • Microsoft DirectML 现在支持 Copilot+ PC 和 WebNN
  • 在繁忙工作环境中提升开发效率:JetBrains IntelliJ IDEA 的应用
  • Python中的函数艺术:解锁高效编程的秘密
  • 零差云控电机ubuntu+IGH调试记录
  • 【Linux】POSIX版本 信号量
  • 质量属性场景-系统架构师(六十)
  • Datawhale X 李宏毅苹果书 AI夏令营 Task3打卡
  • 后端开发刷题 | 面试篇3
  • DASK==延迟对象delayed
  • QT QGraphicsView实现预览图片显示缩略图功能
  • Protocol Buffers
  • java打包jar后读取依赖jar包中的文件资源,支持读取jlink打包的模块镜像中读取
  • axure9树形元件节点的添加