Spring-Statemachine 状态机

本文详述了如何搭建一个基于Spring-Statemachine的状态机,包括Spring-Boot框架的使用、版本选择(2.0.1.RELEASE)、状态与事件的枚举定义、业务逻辑编写以及测试步骤。在测试过程中,由于状态机初始化问题,需要通过特定方法恢复状态。还提到了版本升级(从2.0.1到2.2.0)带来的影响,以及恢复状态机状态的方法实现。
摘要由CSDN通过智能技术生成

此博客有详细的搭建过程,我这里写一下在搭建过程中的理解和使用

https://www.cnblogs.com/cnblog-long/p/7245522.html

再复述一下搭建过程:
搭建一个spring-boot 的框架
Spring-Statemachine 依赖 版本号要特别注意

2.0.1.RELEASE

		<!-- 状态机-->
        <dependency>
            <groupId>org.springframework.statemachine</groupId>
            <artifactId>spring-statemachine-starter</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

先是创建两个枚举

 /**
 * 触发事件枚举
 */
public enum RegEventEnum {
   
    // 连接
    CONNECT,
    // 注册
    REGISTER,
    // 注册成功
    REGISTER_SUCCESS,
    // 注销
    UN_REGISTER,
    // 注册失败
    REGISTER_FAILED,
    ;
}

/**
 * 状态枚举
 */
public enum RegStatusEnum {
   

    // 未连接
    UNCONNECTED,
    // 已连接
    CONNECTED,
    // 注册中
    REGISTERING,
    // 已注册
    REGISTERED,
    // 失败
    FAIL,
    ;
}

构建状态机功能


import com.li.statemachine.enums.RegEventEnum;
import com.li.statemachine.enums.RegStatusEnum;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.StateMachineContext;
import org.springframework.statemachine.StateMachinePersist;
import org.springframework.statemachine.config.EnableStateMachine;
import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
import org.springframework.statemachine.persist.DefaultStateMachinePersister;
import org.springframework.statemachine.support.DefaultStateMachineContext;

import java.util.EnumSet;

/**
 * @EnableStateMachine注解,标识启用 Spring StateMachine 状态机功能。
 */
@Configuration
@EnableStateMachine
public class StateMachineConfig extends StateMachineConfigurerAdapter<RegStatusEnum, RegEventEnum> {
   

    /**
     * 初始化状态机状态
     *
     * @param states
     * @throws Exception
     */
    @Override
    public void configure(StateMachineStateConfigurer<RegStatusEnum, RegEventEnum> states) throws Exception {
   
        // 初始化状态机状态
        states.withStates()
                // 定义初始状态
                .initial(RegStatusEnum.UNCONNECTED)
                // 定义状态机状态
                .states(EnumSet.allOf(RegStatusEnum.class));
        /*其中,initial(RegStatusEnum.UNCONNECTED) 定义了初始状态是未连接状态。
        states(EnumSet.allOf(RegStatusEnum.class)) 定义了定义状态机中存在的所有状态。*/
    }

    /**
     * 初始化状态迁移事件
     * 其中 source 指定原始状态,target 指定目标状态,event 指定触发事件。
     *
     * @param transitions
     * @throws Exception
     */
    @Override
    public void configure(StateMachineTransitionConfigurer<RegStatusEnum, RegEventEnum> transitions) throws Exception {
   
        transitions
                // 1.连接事件 初始化 未连接 状态改变为 已连接
                .withExternal()
                .source(RegStatusEnum.UNCONNECTED)
                .target(RegStatusEnum.CONNECTED)
                .event(RegEventEnum.CONNECT)

                // 2.注册事件  ,已连接  --> 注册中
                .and()
                .withExternal()
                .source(RegStatusEnum.CONNECTED)
                .target(RegStatusEnum.REGISTERING)
                .event(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值