什么是状态机:
一组状态,各个状态之间,依据一定的条件(如 :输入一个1 或者是 0),存在一定的转换,(从状态X转换到状态Y)它有一个起始状态和若干终结状态,从起始状态开始,根据输入的串转换状态,直到所有的输入的被状态机处理,看看最后停留的状态是否为终结状态,是,说明这个串符合这个状态机规则,或者说明这个状态被这个状态机接受!
流程可能是瞬间的动作经历很多步骤,比如“登录”流程,点击“登录”按钮之后,会有验证帐号、密码、验证码的诸多流程,但是都是在点击登录按钮的瞬间,逐一完成。
状态机表示是一个个已经完成的状态,每一个环节都是可以独立存在的
状态:
事件:
此时,共有三个状态:待支付、待收货、结束
两个引起状态迁移的事件:支付、收货
支付事件PAY会触发状态从待支付UNPAID状态到待收货WAITING_FOR_RECEIVE状态的迁移
收货事件RECEIVE会触发状态从待收货WAITING_FOR_RECEIVE状态到结束DONE状态的迁移。
状态机配置类:初始化状态的配置、状态迁移的流程配置、事件监听配置
配置说明:
@EnableStateMachine
注解 :启用 Spring StateMachine 状态机功能
configure(StateMachineStateConfigurer<States, Events> states)
:初始化当前状态机拥有哪些状态,initial(States.UNPAID)
定义了初始状态为 UNPAID、
states(EnumSet.allOf(States.class))
指定了上一步定义的所有状态作为该状态机的状态定义。
configure(StateMachineTransitionConfigurer<States, Events> transitions)
初始化当前状态机有哪些状态迁移动作,包含 来源状态source
,目标状态target
以及触发事件event
。
configure(StateMachineConfigurationConfigurer<States, Events> config)
给当前的状态机指定状态监听器,listener()
调用了下一个内容创建的监听器实例,用于处理发生的各个状态迁移事件。
StateMachineListener<States, Events> listener()
创建 StateMachineListener
状态监听器的实例,该实例中会定义具体的状态迁移处理逻辑,上面的实现中只是做了一些输出,实际业务场景包含更负责的逻辑,一般情况下,将该实例的定义放到独立的类中定义,并用注入的方式进行加载。
启动:
1、run
函数定义了整个流程的处理过程,其中 start()
创建这个订单流程,订单会处于待支付状态
2、调用 sendEvent(Events.PAY)
执行支付
3、调用 sendEvent(Events.RECEIVE)
来完成收货
Spring StateMachine 小结 :
- 定义状态和事件枚举
- 为状态机定义使用的所有状态以及初始状态
- 为状态机定义状态的迁移动作
- 为状态机指定监听处理器
状态监听器
Spring StateMachine 实现状态机,代码逻辑简单并且具有层次化。状态的整个调度逻辑主要依靠配置的方式定义,所有的业务逻辑操作都被定义在了状态监听器,其实状态监听器还可以实现事件捕获等,通过查看 StateMachineListener
接口来了解它所有的事件定义:
注解方式的监听器 :