我是靠谱客的博主 无语帆布鞋,最近开发中收集的这篇文章主要介绍Spring StateMachine学习(二) —— 多个状态机,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在实际的企业应用中,基本不可能只有一个状态机流程在跑,比如订单,肯定是很多个订单在运行,每个订单都有自己的订单状态机流程。我们就需要在每次使用时创建一个新的状态机。

创建多个状态机

通过 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学习(二) —— 多个状态机所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部