概述
在实际的企业应用中,基本不可能只有一个状态机流程在跑,比如订单,肯定是很多个订单在运行,每个订单都有自己的订单状态机流程。我们就需要在每次使用时创建一个新的状态机。
创建多个状态机
通过 RefundReasonMachineBuilder
创建多个状态机。
@Slf4j
@Component
public class RefundReasonMachineBuilder {
public StateMachine<RefundReasonStatus, RefundReasonEvents> build(BeanFactory beanFactory) throws Exception {
StateMachineBuilder.Builder<RefundReasonStatus, RefundReasonEvents> builder = StateMachineBuilder.builder();
log.info("构造退款原因修改状态机");
builder.configureConfiguration()
.withConfiguration()
.machineId("refundReasonMachine")
.beanFactory(beanFactory);
/**
* 设置初始值和状态列表
*/
builder.configureStates().withStates()
.initial(RefundReasonStatus.READY_TO_APPROVE)
.states(EnumSet.allOf(RefundReasonStatus.class));
/**
* 设置动作和状态变更
*/
builder.configureTransitions()
.withExternal()
.source(RefundReasonStatus.READY_TO_APPROVE).target(RefundReasonStatus.APPROVED)
.event(RefundReasonEvents.APPROVE).action(action())
.and()
.withExternal()
.source(RefundReasonStatus.READY_TO_APPROVE).target(RefundReasonStatus.REJECT)
.event(RefundReasonEvents.REJECT)
.and()
.withExternal()
.source(RefundReasonStatus.READY_TO_APPROVE).target(RefundReasonStatus.AUTO_REJECT)
.event(RefundReasonEvents.TIME_OUT);
return builder.build();
}
@Bean
public Action<RefundReasonStatus, RefundReasonEvents> action() {
return (stateContext) -> log.info("action:{}", stateContext);
}
}
这个后面的内容和上一章的OrderSingleEventConfig一模一样,但在类的上面注解了这一句:@WithStateMachine(id = "refundReasonMachine")
。这个id对应的就是OrderStateMachineBuilder 里面的MACHINEID,被builder写到.machineId(MACHINEID)里面。
通过这个类就能创建多个状态机。
@Slf4j
@RestController
public class TestController {
@Autowired
private RefundReasonMachineBuilder refundReasonMachineBuilder;
@Autowired
private BeanFactory beanFactory;
@GetMapping("test/machine")
public void testMachine() throws Exception {
StateMachine<RefundReasonStatus, RefundReasonEvents> stateMachine = refundReasonMachineBuilder.build(beanFactory);
stateMachine.start();
stateMachine.sendEvent(RefundReasonEvents.APPROVE);
log.info("最终状态:" + stateMachine.getState().getId());
}
}
这样一个请求就新增一个状态机的搞法很不经济,而且状态机也不是越多越好,而应该是和业务对象一一对应才行,比如订单,就是一个订单一个状态机,而不是每次订单变化就build的一个。这个问题就用到了状态机的持久化。
最后
以上就是无语帆布鞋为你收集整理的Spring StateMachine学习(二) —— 多个状态机的全部内容,希望文章能够帮你解决Spring StateMachine学习(二) —— 多个状态机所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复