在实际业务中,状态机可能需要在某个环节停留,等待其他业务的触发,然后再继续下面的流程。比如订单,可能在支付环节需要等待一个剁手的用户隔天再下单,所以这里面涉及到一个创建的状态机该何去何从的问题。在spring statemachine中,给出来的办法就是保存起来,到需要的时候取出来用。
持久化到本地内存
首先要实现StateMachinePersist
接口,这个接口非常简单,就是write和read,用来读写StateMachineContext
。
@Component
public class InMemoryStateMachinePersist implements StateMachinePersist<RefundReasonStatus, RefundReasonEvents, String> {
private Map<String, StateMachineContext<RefundReasonStatus, RefundReasonEvents>> refundReasonMap =
new HashMap<>();
@Override
public void write(StateMachineContext<RefundReasonStatus, RefundReasonEvents> stateMachineContext, String orderSn) throws Exception {
refundReasonMap.put(orderSn, stateMachineContext);
}
@Override
public StateMachineContext<RefundReasonStatus, RefundReasonEvents> read(String orderSn) throws Exception {
return refundReasonMap.get(orderSn);
}
}
InMemoryStateMachinePersist
保存的对象是StateMachineContext,不是StateMachine,所以我们还不能直接用它,需要配置一下。
@Configuration
public class PersistConfig {
@Autowired
private InMemoryStateMachinePersist inMemoryStateMachinePersist;
/**
* 注入StateMachinePersister对象
*
* @return
*/
@Bean(name="orderMemoryPersister")
public StateMachinePersister<RefundReasonStatus, RefundReasonEvents, String> getPersister() {
return new DefaultStateMachinePersister<>(inMemoryStateMachinePersist);
}
}
然后我们就能在controller里面使用了。
@Autowired
@Qualifier("orderMemoryPersister")
private StateMachinePersister<RefundReasonStatus, RefundReasonEvents, String> orderMemorypersister;
//保存状态机
@GetMapping("/testMemoryPersister")
public void tesMemorytPersister(