一种可行的方法是
StateMachine即时创建并使用的状态从数据库中重新补充状态机
Order。在这种情况下,您需要执行以下步骤:
- 重设
StateMachine
所有地区 Order
从数据库加载状态- 新建
DefaultStateMachineContext
并相应地填充
假设您有一个build方法,该方法返回用于处理订单事件的新状态机(使用StateMachineFactory),但是对于现有订单,它将从数据库中重新补充状态。
StateMachine<Status, Event> build(long orderId) { orderService.getOrder(orderId) //returns Optional .map(order -> { StateMachine<Status, Event> sm = stateMachineFactory.getStateMachine(Long.toString(orderId)); sm.stop(); rehydrateState(sm, sm.getExtendedState(), order.getStatus()); sm.start(); return sm; }) .orElseGet(() -> createNewStateMachine(orderId);}void rehydrateState(StateMachine<Status, Event> newStateMachine, ExtendedState extendedState, Status orderStatus) { newStateMachine.getStateMachineAccessor().doWithAllRegions(sma -> sma.resetStateMachine(new DefaultStateMachineContext<>(orderStatus, null, null, extendedState)); });}


