摘要:在实际的企业开发中,不可能所有情况都是从头到尾的按状态流程来,会有很多意外,比如历史数据,故障重启后的遗留流程,所以这种可以任意调节状态的才是我们需要的状态机。
1、伪持久化和中间段的状态机
我们设想一个业务场景,就比如订单吧,我们一般的设计都会把订单状态存到订单表里面,其他的业务信息也都有表保存,而状态机的主要作用其实是规范整个订单业务流程的状态和事件,所以状态机要不要保存真的不重要,我们只需要从订单表里面把状态取出来,知道当前是什么状态,然后伴随着业务继续流浪到下一个状态节点就好了(流浪远方,流~浪~~)。
我们先实现一个StateMachinePersist,因为我不想真的持久化,所以就敷衍一下,持久化是什么,啥也不干。
import org.springframework.statemachine.StateMachineContext;
import org.springframework.statemachine.StateMachinePersist;
import org.springframework.statemachine.support.DefaultStateMachineContext;
import org.springframework.stereotype.Component;
@Component
public class OrderStateMachinePersist implements StateMachinePersist
@Override public void write(StateMachineContextcontext, Order contextObj) throws Exception { //这里不做任何持久化工作 } @Override public StateMachineContext read(Order contextObj) throws Exception { StateMachineContext result = new DefaultStateMachineContext (OrderStates.valueOf(contextObj.getState()), null, null, null, null, "orderMachine"); return result; }
}
然后在PersistConfig里面转换成StateMachinePersister
@Configuration
public class PersistConfig {
@Autowired
private OrderStateMachinePersist orderStateMachinePersist;
@Bean(name="orderPersister")
public StateMachinePersisterorderPersister() { return new DefaultStateMachinePersister (orderStateMachinePersist); }
}
现在问题来了,不持久化的持久化类是为啥呢,主要就是为了取一个任何状态节点的状态机,方便继续往下执行,请看controller
@RestController
@RequestMapping("/statemachine")
public class StateMachineController {
@Resource(name="orderPersister") private StateMachinePersisterpersister; @RequestMapping("/testOrderRestore") public void testOrderRestore(String id) throws Exception { StateMachine stateMachine = orderStateMachineBuilder.build(beanFactory); //订单 Order order = new Order(); order.setId(id); order.setState(OrderStates.WAITING_FOR_RECEIVE.toString()); //恢复 persister.restore(stateMachine, order); //查看恢复后状态机的状态 System.out.println("恢复后的状态:" + stateMachine.getState().getId()); }
}
看到没有,用builder建了一个新的状态机,用restore过了一手,就已经是一个到达order指定状态的老司机状态机了,在这里,持久化不是本意,让状态机能够随时抓换到任意状态节点才是目的。在实际的企业开发中,不可能所有情况都是从头到尾的按状态流程来,会有很多意外,比如历史数据,故障重启后的遗留流程......,所以这种可以任意调节状态的才是我们需要的状态机。
2、废话时间
这篇文章内容比较少,所以决定说点废话,凑点字数。从上面可以看到,状态机的本身数据其实没啥价值,有价值的业务数据比如订单其实都存库表,状态值一般也是伴随订单一起保存就行了。那么状态机最核心的价值在哪呢?在第一章的时候其实就讲过了,spring statemachine框架的作用在于提供一个软件项目业务切入的视角,我们的关注点不在于具体的业务数据,而是状态流程,这个作为主线,我们必须要清楚,但是企业开发是很复杂的,情况丛生,比如我们一直举例的流程,都是一条直线的流程:
简单的令人发指,实际的情况显然比这个复杂,会有分支选择,会有回到上一个状态的情况。下一章我们来弄一个复杂的状态机流程图来描述一下,试一下spring statemachine 在企业真实环境下的表现力。
源代码地址
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75269.html
摘要:目前为止,我们都是从状态流程的开始阶段创建一个状态机,然后一路走下去。然后就可以愉快的在里面看怎么用了发送事件持久化恢复状态机后的状态为执行完保存后,大家可以自己在客户端查看以下,是不是有内容保存进去了。 目前为止,我们都是从状态流程的开始阶段创建一个状态机,然后一路走下去。但在实际业务中,状态机可能需要在某个环节停留,等待其他业务的触发,然后再继续下面的流程。比如订单,可能在支付环节...
摘要:创建了后,状态机就可以不只是传一个,可以组合和数据内容一起发送给状态机变化的处理类了。到这里为止,状态机通过对象就和其他的业务代码做到了数据连接。 在企业开发中,数据在不同的业务间传输是最常见的工作,所以虽然我们的主架构是用的状态机,也就是从流程状态的角度来看待这个项目,但在具体业务中,每个状态的转变中会牵涉到各类业务,这些业务有些需要收到状态机变化的通知,需要把状态值传递给业务类和业...
摘要:虽然多个状态机的问题解决了,但是对于实际的企业应用而言,还是有问题。这个问题就用到了状态机的持久化,我们下一章就谈谈持久化问题。 1、多个状态机的搞法在实际的企业应用中,基本不可能只有一个状态机流程在跑,比如订单,肯定是很多个订单在运行,每个订单都有自己的订单状态机流程,但上一章的例子,大家可以试一下,当执行到一个状态时,再次刷新页面,不会有任何日志出现,当一个状态流程执行到某个状态,...
摘要:先来一个,它的主要作用就告诉状态机的初始状态应该啥样,然后把整个状态流程都用代码配置出来。继承了类,表明身份,我就是来配置状态机的初始状态,并描绘一下状态流程的全过程。 上一篇说了很多废话,这一篇就不唠叨,先跑起来 1、来个spring boot去start.spring.io新建一个springboot的项目,虽然我对spirngboot也有不少的牢骚,但作为demo的开始,还是一个...
摘要:目前为止,多个状态机和多种状态机都可以在里面实现了,下一章我们来解决下状态机和实际业务间的数据传输问题,毕竟我们不是为了让状态机自个独自玩耍,和业务数据互通有无才是企业开发的正道。 在上一章的例子中,我们实现了多个状态机并存执行,不同的订单有各自的状态机运行,但只有一种状态机,这显然不能满足实际业务的要求,比如我就遇到了订单流程和公文审批流程在同一个项目的情况,所以我们这一章讲怎么让多...
阅读 3083·2023-04-25 18:22
阅读 2264·2021-11-17 09:33
阅读 3215·2021-10-11 10:59
阅读 3210·2021-09-22 15:50
阅读 2761·2021-09-10 10:50
阅读 831·2019-08-30 15:53
阅读 412·2019-08-29 11:21
阅读 2623·2019-08-26 13:58