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

Java系列文章目录

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


一、前言

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

二、学习内容:

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

五、总结:

确保每一步按配置规定走

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

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

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


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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值