java状态机学习总结


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

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

那么我们为什么要用到状态机呢,正常的写法也是可以实现的啊,用状态机的好处是什么?
1.不需要每个接口都校验当前状态:直接数据库配置某个状态,加某个操作,才能进行下去,如果不对的状态进行该操作,会报错

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

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

4.易变更,快速修改

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

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

状态机的实现:说了这么多,状态机到底是怎么实现的呢?
首先会有2个表:flow和flow_picker表:
flow表主要用于存放不同的流程的名字,主要会有个id,订单走一个流,退货单走一个流


flow_picker主要是每个业务创建的时候,会关联到哪个flow,就是关联到哪个流程id里,会通过来源,渠道,类型,等级等等条件,筛选出这个订单,关联的flow,存入订单表里的flow_id字段


然后会有个配置流程的表:

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

根据这个配置,初始化的时候注入所有的action,可以调到数据库对应的配置的aciton类,同一个接口,可以执行多个流程,就好了

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值