【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);
五、总结:
确保每一步按配置规定走
🌟 顺序错误动作执行不了,那么前端无法干扰状态机运行
- 设置事件的规则
- 设置事件的动作
- 调用事件
(后续有遇到问题再添加)
声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。