抱歉,最近懒癌发作,好久没写了,今天续上
这节先列举下状态机中一些核心的概念,方便后续理解:
状态机定义-相关概念
先从状态机的定义入手,StateMachine<States, Events>,其中:
- StateMachine:状态机模型
- state:S-状态,一般定义为一个枚举类,如创建、待风控审核、待支付等状态
- event:E-事件,同样定义成一个枚举类,如订单创建、订单审核、支付等,代表一个动作。
一个状态机的定义就由这两个主要的元素组成,状态及对对应的事件(动作)。
状态机-相关概念
- Transition: 节点,是组成状态机引擎的核心
- source:节点的当前状态
- target:节点的目标状态
- event:触发节点从当前状态到目标状态的动作
- guard:起校验功能,一般用于校验是否可以执行后续action
- action:用于实现当前节点对应的业务逻辑处理
举个简单的例子:
builder.configureTransitions() -- 配置节点
.withExternal() //表示source target两种状态不同
.source(CREATE) //当前节点状态
.target(WYD_INITIAL_JUMP) //目标节点状态,这里是设置了个中间状态
.event(BizOrderStatusChangeEventEnum.EVT_CREATE) //导致当前变化的动作/事件
.action(orderCreateAction, errorHandlerAction) //执行当前状态变更导致的业务逻辑处理,以及出异常时的处理
补充说明:
- withExternal 是当source和target不同时的写法,如上例子
- withInternal 当source和target相同时的串联写法,比如付款失败时,付款前及付款后都是待付款状态
- withChoice 当执行一个动作,可能导致多种结果时,可以选择使用choice+guard来跳转
目前我主要使用的就是这三种,当然如果有更复杂的情况,还有withLocal\withJunction等各种写法,但是:当你对一项技术并不是那么了解时,先尽可能的用简单的实现来处理你的业务,出现问题的可能性最小,后续可以再慢慢扩展。
注意:
-
上述代码event之后并没有设置guard,代表默认会执行对应action。
-
这里的orderCreateAction及errorHandlerAction都是使用spring注入进来的业务bean。
稍微复杂的节点配置
接上面的withExternal,下面是使用choice做了一个分支选择,代码如下:
.and() // 使用and串联
.withChoice() // 使用choice来做选择
.source(WYD_INITIAL_JUMP) // 当前状态
.first(WAIT_REAL_NAME_AUTH, needNameAuthGurad(), needNameAuthAction) // 第一个分支
.last(WAIT_BORROW, waitBorrowAction) // 第二个分支
说明:
- 多个节点之间使用and()串联
- 注意,withChoice没有对应的event,所以依赖上一个节点的event,只要source是WYD_INITIAL_JUMP,就会自动执行当前choice transition
- withChoice没有对应的target,只有几个选择分支
- first/then/last 类似于 if--else if--else ,then可以不设置,但是last一定要有,否则会报错
- needNameAuthGurad() 用于判断是否走当前分支,返回true时选择当前分支,返回false走下面分支
- last中其实是省略了一个guard的实现,默认为true,意味着如果不走first分支,就会走last分支。
- withChoice其实是个PseudoState,也就是伪状态或瞬时状态,会马上跳转到下面的分支流程中。
好啦,基本上项目中用到的核心概念就先到这里,下一节会讲下状态机引擎的持久化处理。
网友评论