状态机
有限状态机(FSM):Finite State Machine
StateMachine<States, Events>
- States:状态
- Events:事件
定义 transitions :
- 当前状态 + 事件 => 下一个状态
定义动作:
- 进入状态的动作、离开状态的动作、执行事件的动作;
stateless4j
Lightweight Java State Machine.
- 无其他依赖;
- 足够轻量,创建StateMachine实例开销小;
- 支持目标状态的动态设置(即由函数确定;
- Action 同步且在调用线程中执行(即无线程池);
- 持久化状态需应用端实现,实现比较麻烦;
Spring Statemachine
a common infrastructure to work with state machine concepts in Spring applications.
- 支持持久化;
- 分层状态机结构;
- 支持分布式状态机;
- 注解声明,功能丰富,同时上手较复杂;
- 状态机实例不能单例使用,线程不安全,配合工厂模式;
每次请求都要先构造出一个状态机实例(因为有状态),并重置为之前的状态,然后再进行状态流转,如果构造状态机复杂,会影响系统的QPS,大量的状态机实例也可能会带来GC等问题。
- 使用工厂方式对于类似订单等场景StateMachineFactory缓存订单对应的状态机实例意义不大
squirrel
a State Machine library, which provided a lightweight, easy use, type safe and programmable state machine implementation for Java.
- StateMachine实例创建开销小,设计上就不支持单例复用;
- 支持层次化状态机;
- 支持 外部状态转换(即状态发生变更)和内部状态转换(即发生事件但状态不变更);
- 支持条件转换,既满足某个条件,才进行状态转换;
- Action 的执行,支持同步和异步;
- 支持注解配置 onEntry/OnExit 和 Transition;
- 对 Action 的执行,和Transition的执行,都定义相关的Before/After的Hook;
配置:
- 默认是一个线程的ExecutorServices,且 Action 默认为同步;