上一节我们封装了外部业务代码对于状态机的调用类,其中有两个方法,状态机上下文的持久化和初始化,这两个方法已经由spring定义了标准化的接口,我们只需要实现具体的实现类即可。
状态机上下文初始化和持久化的实现类
/**
* Author: lehu
* Description:
* Date: Create in 下午6:45 20/5/21
*/
@Slf4j
@Component
public class OrderStateMachinePersist implements StateMachinePersist<OrderStatusEnum, OrderChangeEventEnum, PersisterDO> {
@Autowired
@Qualifier("redisOrderStateMachineContextRepository")
private RedisStateMachineContextRepository<OrderStatusEnum, OrderChangeEventEnum> redisOrderStateMachineContextRepository;
@Override
public void write(StateMachineContext<OrderStatusEnum, OrderChangeEventEnum> context, PersisterDO persisterDO) throws Exception {
// redisOrderStateMachineContextRepository.save(context, persisterDO.getBizId());
}
/**
* Read a {@link org.springframework.statemachine.StateMachineContext} from a persistent store
* with a context object {@code T}.
*
* @param persisterDO the context ojb
* @return the state machine context
* @throws Exception the exception
*/
@Override
public StateMachineContext<OrderStatusEnum, OrderChangeEventEnum> read(PersisterDO persisterDO) throws Exception {
// //获取缓存数据
// StateMachineContext<OrderStatusEnum, OrderChangeEventEnum> context = null;
// try {
// context = redisOrderStateMachineContextRepository.getContext(persisterDO.getBizId());
// } catch (Exception e) {
// log.error("获取状态机上下文失败:" + JSON.toJSONString(persisterDO));
// }
// if (context == null) {
return new DefaultStateMachineContext<>(OrderStatusEnum.getByCode(persisterDO.getCurrentState()),
null, null, null, null, persisterDO.getMachineId());
// }
// return context;
}
- spring对于持久化的实现是使用redis来实现的,该方法类也已经封装在了官方的SDK中,但是由于实际业务中对于同一个订单可能会发生一些数据异常,导致持久化的状态上下文异常,如果异常之后不能对该状态机进行状态恢复,所以笔者直接在每次初始化的时候都按业务传入的当前状态重新构造一个上下文处理,这样的处理方式对于异常的容错性会相对高一点。
我们使用javaConfig的方式对持久化类进行配置,这样可以支持多个持久化状态类型
@Configuration
public class PersistConfig {
@Autowired
private OrderStateMachinePersist orderStateMachinePersist;
@Bean(name = "orderStateMachinePersister")
public StateMachinePersister<OrderStatusEnum, OrderChangeEventEnum, PersisterDO> orderStateMachinePersister() {
return new DefaultStateMachinePersister<>(orderStateMachinePersist);
}
}
/**
* Author: lehu
* Description: redis的持久化配置类
* Date: Create in 上午12:44 20/5/22
*/
@Configuration
public class RedisStateMachineRepositoryConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean(name = "redisOrderStateMachineContextRepository", autowire = Autowire.BY_TYPE)
public RedisStateMachineContextRepository<OrderStatusEnum, OrderChangeEventEnum> redisOrderStateMachineContextRepository() {
return new RedisStateMachineContextRepository<>(redisConnectionFactory);
}
}
节对用状态机上下文的持久化就说到这里,下一节将会介绍外部调用的demo,并展示状状态机执行的外部参数上下文对象的结构。
上一篇:Spring-StateMachine企业级项目应用(四)-状态机管理
下一篇:Spring-StateMachine企业级项目应用(六)-状态机调用