Spring StateMachine学习(四) —— 持久化

在实际业务中,状态机可能需要在某个环节停留,等待其他业务的触发,然后再继续下面的流程。比如订单,可能在支付环节需要等待一个剁手的用户隔天再下单,所以这里面涉及到一个创建的状态机该何去何从的问题。在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(
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值