Spring-状态机

目录

1.状态机是什么?

2.使用场景

3.状态机是怎么实现的呢?

4.使用示例

5.手写简易状态机与Spring状态机的比较

6.附1 : 示例代码下载

7.附2 : spring官方文档地址

1. 状态机是什么? (状态+事件+处理=状态机)

把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,进行协调处理的控制中心, 叫做状态机.

2. 使用场景

在以下情况下,项目是使用状态机的理想选择:

  • 您可以将应用程序或其结构的一部分表示为状态。

  • 您希望将复杂逻辑拆分为较小的可管理任务。

  • 该应用程序已经遭遇并发问题(例如)异步发生的事情。

您尝试在以下情况下实施状态机:

  • 使用判断标识或枚举来建模情境。

  • 具有仅对应用程序生命周期的某些部分有意义的变量。

  • 循环遍历if-else结构(或者更糟糕的是,多个这样的结构),检查是否设置了特定的标志或枚举,然后进一步例外,当您的标志和枚举的某些组合存在或不存在时该怎么做。

3. 状态机是怎么实现的呢?

状态机由 spring-message(消息)模块 + spring-tx(持久化事物)模块 实现

流程如下

1.将状态转换事件绑定关系

2.生产者发布事件

3.事件消费者消费事件 (同一个状态机中, 如果第二个事件已经发布, 并且上一个事件未执行完成, 则会不执行第二个事件,同时发布一条EventNotAccepted事件)

4. 使用示例

  • 项目目录结构

zhuangtaijixiangmujiegou

  • 在应用启动时, 绑定状态变换与事件的关系

zhuangtaijibangding.png

  • 创建消息 (一条消息就是一个事件)

zhuangtaijichuangjianxiaoxi.png

  • 发送消息至状态机

zhuangtaijifasongxiaoxi.png

  • 事件消费者去处理逻辑

zhuangtaijishijianxiaofeichuli.png

  • 补充: 其他消费类型

zhuangtaijiqitaxiaofei.png

  • 流程图方式

zhuangtaijiliuchengtu.png

5. 手写简易状态机 与 Spring状态机的比较

手写代码量并没有多少, 目的就是为了好维护,新人好上手.

手写代码如下

zhuangtaijishouxie1.png

zhuangtaijishouxie2.png

  比较项 手写简易状态机 Spring状态机
1 代码量
2 学习成本
3 实现事物 简单(事物注解搞定) 复杂 (需要实现监听类,ack机制实现)
4 分布式状态机 需要编码实现 自带
5 编写流程图 不支持 支持
6 状态持久化 支持 支持
7 包依赖 无依赖 依赖spring-message与spring-tx包
8 灵活度 灵活 不如手写
9 编程规范 不规范,靠自觉 规范编码
10 历史状态 不支持 支持
11 动态启用/停用状态(需要写表达式参数) 不支持 支持
12 明确所有事件(异常时,未消费时,消费前,消费后,状态改变时) 都写在一块(需要按需实现) 支持, 在方法上打注解

6. 示例代码下载

(点我下载) statemachine.zip

7. spring官方文档地址

https://docs.spring.io/spring-statemachine/docs/2.1.3.RELEASE/reference/#sm-repository

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

备案信息公示
京ICP备18003381号
京ICP备18003381号-1