【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 拓展内容
  • 五、总结:

一、前言

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

二、学习内容:


三、问题描述


四、解决方案:

4.1 认识依赖

java"><!--状态机依赖-->
<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具体区分不同订单

参考代码:

java">@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();// 检查当前状态是否为 PAIDif (currentState.equals(Status.PAID)) {// 使用订单ID更新订单状态ordersService.updateOrderStatus(orders.getId(), Status.PAID);}}log.info("支付事件被发送了....返回:{}", event);
}
  • 如果所有流程走完怎么重置呢
java">status.withStates().initial(Status.STANDBY).state(Status.UNPAID).state(Status.PAID).end(Status.FINISHED);

五、总结:

确保每一步按配置规定走

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

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

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


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

在这里插入图片描述


http://www.ppmy.cn/news/1516419.html

相关文章

【Python游戏】Joystick游戏手柄编程介绍

本文收录于 《一起学Python趣味编程》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、正式开始2.1 认识游戏手柄结构2.2 了解pygame.joystick模块简单使用步骤2.3 了解pygame.joystic…

USB详解,配置及难点

一、USB发展历史 二、USB简介 USB有USB1.0/1.1/2.0/3.0多个版本&#xff0c;标准USB由4根线组成,VCC&#xff0c;GND&#xff0c;D&#xff0c;D-&#xff0c;其中D和D-是数据线&#xff0c;采用差分传输。在USB主机上,D-和D都是接了15K的电阻到地,所以在没有设备接入的时候,D、…

网络安全场景化解决方案编写教程(大纲)

目录 1.概述 1.1.项目背景 1.2.项目现状 1.3.项目目标 2.需求分析 3.方案设计 3.1设计依据 3.2设计原则 3.3架构设计 3.3产品设计 3.5服务设计 4.方案收益 5.项目预算 附录A&#xff08;案例&#xff09; 附录B&#xff08;公司资质人员资质等&#xff09; 1.概…

UnrealEngine学习(02):虚幻引擎编辑器界面详解

学习一款软件&#xff0c;我个人建议是先学习怎么用&#xff0c;然后是学习怎么用的好&#xff0c;再研究源码。 上一篇文章详细描述了我们该如何安装虚幻5引擎&#xff1a; UnrealEngine学习(01)&#xff1a;安装虚幻引擎https://blog.csdn.net/zuodingquan666/article/deta…

无人机+消防车:高楼灭火系统技术详解

“无人机消防车”高楼灭火系统技术是一种创新的消防解决方案&#xff0c;旨在解决高层建筑灭火难题。以下是对该技术的详细解析&#xff1a; 一、技术背景与需求 高层建筑数量多&#xff0c;火灾隐患多发。根据国家消防救援局发布的数据&#xff0c;高层建筑火灾频发&#xf…

Robot Operating System——兴趣区域信息

大纲 应用场景定义字段解释 案例 sensor_msgs::msg::RegionOfInterest 是 ROS (Robot Operating System) 中的一个消息类型&#xff0c;用于表示图像中的感兴趣区域 (Region of Interest, ROI)。它通常与图像处理和计算机视觉任务相关联&#xff0c;帮助系统聚焦于图像中的特定…

Java并发编程的核心概念--线程与进程

‌原子性‌&#xff1a;‌操作或多个操作要么全部执行且不被打断&#xff0c;‌要么都不执行。‌这保证了线程在执行操作时不会被其他线程干扰。‌‌可见性‌&#xff1a;‌当多个线程访问同一个变量时&#xff0c;‌一个线程修改了这个变量的值&#xff0c;‌其他线程能够立即…

【MySQL】MySQL表的增删改查(初阶)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 表内容操作 插入内容 按顺序插入 指定某些列插入 一次插入多行记录 插入时间 查询表内容 全列查询 指定列查询 指定表达式查询 用as取别名 ​编辑 去重查询 排序查询…

计算机毕业设计选题推荐-高校学术交流平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

基于微信小程序的行李寄存管理系统的设计与实现(论文+源码)_kaic

基于微信小程序的行李寄存管理系统的设计与实现(论文源码)_kaic 摘 要 人们外出旅行的时候&#xff0c;经常会需要到行李寄存的服务。行李寄存处在全国各地都很常见。现存的行李寄存方式很传统&#xff0c;适合小规模的行李寄存&#xff0c;当行李数量较多时&#xff0c;就…

JVM常见面试题总结

文章目录 1 JVM 组成1.1 JVM架构组成&#x1f525;1.2 JVM 内存结构/内存模型&#x1f525;1.3 堆和栈区别&#x1f525;1.4 详细的介绍 Java 堆&#x1f525;1.5 JVM 为什么使用元空间替换了永久代&#xff1f;&#x1f525;1.6 内存溢出与内存泄漏的区别&#x1f525;1.7 OOM…

根据数据库设计开发一套通用的电子商务平台

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(9 分) 【问题 3】(7 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于数据库设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某制造企业为拓展网上销售业…

河南萌新联赛2024第(六)场:郑州大学(补题ABCDFGIL)

文章目录 河南萌新联赛2024第&#xff08;六&#xff09;场&#xff1a;郑州大学A 装备二选一&#xff08;一&#xff09;简单介绍&#xff1a;思路&#xff1a;代码&#xff1a; B 百变吗喽简单介绍&#xff1a;思路&#xff1a;代码&#xff1a; C 16进制世界简单介绍&#x…

es相关概念、索引操作(相当于mysql中的数据库操作)

文章目录 1、概念2、索引操作&#xff08;index&#xff09;2.1、查询索引&#xff08;数据库&#xff09;2.2、创建索引&#xff08;数据库&#xff09;2.3、查看单个索引&#xff08;数据库&#xff09;2.4、删除索引&#xff08;数据库&#xff09; 1、概念 RDBMSesMongoDB…

Manim实现目标的移动和出现速度控制

一&#xff0c;介绍 缓动函数 自定义参数随时间变化的速率。 现实生活中&#xff0c;物体并不是突然启动或者停止&#xff0c; 当然也不可能一直保持匀速移动。就像我们 打开抽屉的过程那样&#xff0c;刚开始拉的那一下动作很快&#xff0c; 但是当抽屉被拉出来之后我们会不自…

【操作系统】实验:进程死锁

目录 一、实验目的 二、实验要求 三、实验步骤 四、核心代码 五、记录与处理 六、思考 七、完整报告和成果文件提取链接 一、实验目的 1掌握死锁的基本概念&#xff1b; 2理解死锁的必要条件&#xff1b; 3理解避免死锁的方法、安全状态等重要概念&#xff1b; 4了解银…

Windows环境如何安装maven并配置IDEA

运行Springboot项目时&#xff0c;出现了依赖错误&#xff0c;最后排查可能是maven安装出错了。 MAVEN版本要和IDEA版本对应&#xff0c;maven发行版本不能比idea版本高&#xff0c;可以在idea查看内置的maven版本。 点击 File–>Settings,在设置页面搜索maven&#xff0c;如…

2024牛客暑期多校训练营7 D.Interval Selection(异或哈希+双指针)

原题链接&#xff1a;D.Interval Selection 题目大意&#xff1a; 给你一个长度为 n n n 的数组 a a a&#xff0c;定义一个区间 [ l , r ] [l,r] [l,r] 内的连续子数组为好的&#xff0c;当且仅当这个子数组内的所有元素 a l , a l 1 , . . . , a r a_{l},a_{l1},...,a_{…

虚幻5|暴击攻击和释放技能,造成伤害

玩家数据的Actor组件制作&#xff1a;虚幻5|制作玩家血量&#xff0c;体力-CSDN博客 造成伤害时&#xff0c;显示暴击及暴击字体颜色和未暴击的字体颜色&#xff0c;还有释放技能连击 一.编辑暴击数据 1.打开之前创建的玩家数据Actor组件 创建一个浮点变量&#xff0c;命名…

Python实现贪心算法

目录 贪心算法简介贪心算法的基本思想贪心算法的应用场景活动选择问题 Python实现活动选择问题代码解释活动选择问题的解贪心算法的正确性分析贪心算法的其他应用贪心算法的局限性贪心算法的优化与变种总结 贪心算法简介 贪心算法&#xff08;Greedy Algorithm&#xff09;是一…