此博客有详细的搭建过程,我这里写一下在搭建过程中的理解和使用
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(