美文网首页spring statemachine
Spring StateMachine-项目中使用状态机(二)-

Spring StateMachine-项目中使用状态机(二)-

作者: AlanKim | 来源:发表于2018-04-06 21:23 被阅读16次

抱歉,最近懒癌发作,好久没写了,今天续上
这节先列举下状态机中一些核心的概念,方便后续理解:

状态机定义-相关概念

先从状态机的定义入手,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,也就是伪状态或瞬时状态,会马上跳转到下面的分支流程中。

好啦,基本上项目中用到的核心概念就先到这里,下一节会讲下状态机引擎的持久化处理。

相关文章

网友评论

    本文标题:Spring StateMachine-项目中使用状态机(二)-

    本文链接:https://www.haomeiwen.com/subject/hpyjcftx.html