目录
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. 使用示例
- 项目目录结构
- 在应用启动时, 绑定状态变换与事件的关系
- 创建消息 (一条消息就是一个事件)
- 发送消息至状态机
- 事件消费者去处理逻辑
- 补充: 其他消费类型
- 流程图方式
5. 手写简易状态机 与 Spring状态机的比较
手写代码量并没有多少, 目的就是为了好维护,新人好上手.
手写代码如下
比较项 | 手写简易状态机 | Spring状态机 | |
---|---|---|---|
1 | 代码量 | 少 | 多 |
2 | 学习成本 | 少 | 多 |
3 | 实现事物 | 简单(事物注解搞定) | 复杂 (需要实现监听类,ack机制实现) |
4 | 分布式状态机 | 需要编码实现 | 自带 |
5 | 编写流程图 | 不支持 | 支持 |
6 | 状态持久化 | 支持 | 支持 |
7 | 包依赖 | 无依赖 | 依赖spring-message与spring-tx包 |
8 | 灵活度 | 灵活 | 不如手写 |
9 | 编程规范 | 不规范,靠自觉 | 规范编码 |
10 | 历史状态 | 不支持 | 支持 |
11 | 动态启用/停用状态(需要写表达式参数) | 不支持 | 支持 |
12 | 明确所有事件(异常时,未消费时,消费前,消费后,状态改变时) | 都写在一块(需要按需实现) | 支持, 在方法上打注解 |
6. 示例代码下载
7. spring官方文档地址
https://docs.spring.io/spring-statemachine/docs/2.1.3.RELEASE/reference/#sm-repository