Osheep

时光不回头,当下最重要。

Java状态机学习总结

Java状态机学习总结

首先,我们需要了解,什么是状态机?

有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型
在我的理解里,状态机可以描述核心业务规则,核心业务内容,总结一下就是a实体,在b状态下,由c角色,在满足d条件时,执行e操作成功后,迁移到f状态下,并产生g事件,通常用于业务复杂的订单等业务里
《Java状态机学习总结》

那么我们为什么要用到状态机呢,正常的写法也是可以实现的啊,用状态机的好处是什么?

1.不需要每个接口都校验当前状态:直接数据库配置某个状态,加某个操作,才能进行下去,如果不对的状态进行该操作,会报错

2.同一个接口配置不同的流程:同一个如审批通过的接口,不同状态下审批不通过,需要走不同的流程,如审批中审批不通过,走改变状态的流程,变更审批中审批不通过,走回退历史的版本数据的流程,如果不用状态机,则需要分开写2个接口,或者在一个接口里走if else,考虑到复杂的订单状态变迁触发节点,可能if-else会非常多,比如某5种状态下的同一个接口走不同的流程

3.实现流程可配制化,高内聚,集中配置,直接在数据库更改配置信息,可维护性和扩展性强

4.易变更,快速修改

5.易使用,极大简化前端的代码,是否可以删除,变更按钮的显示和隐藏通过后端返回的字段展示,后端直接根据状态机来判断是否可以删除,变更

是否还需要乐观锁?

需要的,在接口入口处,会判断这个状态下是否可以进行这个操作,但是高并发情况下,为了保证幂等性,还是需要加一下乐观锁,即传入上一个状态,sql更新的时候加一个status = 上一个状态的条件

状态机的实现:说了这么多,状态机到底是怎么实现的呢?

首先会有2个表:flow和flowpicker表:
flow表主要用于存放不同的流程的名字,主要会有个id,订单走一个流程,退货单走一个流程。
《Java状态机学习总结》
flow
picker主要是每个业务创建的时候,会关联到哪个flow,就是关联到哪个流程id里,会通过来源,渠道,类型,等级等等条件,筛选出这个订单,关联的flow,存入订单表里的flow_id字段
《Java状态机学习总结》
然后会有个配置流程的表:

《Java状态机学习总结》

可以看到,先会根据订单的flowid筛选出走哪个流程,再根据来源状态 sourcestatus,操作operationvalue,会到达目标状态targetstatus,并且会执行actionname,当然actionname是自己配置的,action_name里面的类就是不同流程,执行的代码

根据这个配置,初始化的时候注入所有的action,可以调到数据库对应的配置的aciton类,同一个接口,可以执行多个流程,就好了。
《Java状态机学习总结》

本文完。

点赞