后端与系统架构5448 字

Spring状态机最佳实践

·全库 521 / 611

《Spring状态机最佳实践》共 0.5 万字,通篇围绕 Redis、数据库、MySQL、并发 展开,归在「后端与系统架构」这一层。

覆盖Redis数据库MySQL并发缓存工作流

适合给 AI 系统搭底座、要管得住的人

目录骨架(4 节)
  1. 什么是Spring的状态机
  2. Spring 状态机快速上手
  3. spring状态机
  4. 完整订单演示代码

什么是Spring的状态机

  • Spring 状态机(Spring State Machine)是 Spring Framework 提供的一个模块,用于支持有限状态机(Finite State Machine,FSM)的实现。有限状态机是一个数学模型,描述了一个系统在不同状态之间的转换以及触发这些转换的事件。
  • Spring 状态机主要用于处理对象的状态变化和状态之间的转换。它提供了一种以声明性的方式定义状态和状态之间转换的机制,并能够处理各种事件触发的状态迁移。这在某些应用中非常有用,比如工作流、订单处理、游戏引擎等领域。
  • Spring StatsMachine主要涉及到两个重要的概念,一个是State(状态)、一个是Event(事件)。

​

Spring 状态机快速上手

  • 场景:商城项目中对于订单状态的层层转换。

1.使用Spring状态机先引入它的Maven依赖

​

<!--        状态机-->
<dependency>
  <groupId>org.springframework.statemachine</groupId>
  <artifactId>spring-statemachine-starter</artifactId>
  <version>2.2.0.RELEASE</version>
</dependency>
<!-- Spring State Machine Redis -->
<dependency>
  <groupId>org.springframework.statemachine</groupId>
  <artifactId>spring-statemachine-redis</artifactId>
</dependency>

​

2.生成状态机的状态与事件:(OrderState,OrderEvents)

  • OrderState:
public enum OrderState {
    UNPAID,                 // 待支付
    WAITING_FOR_RECEIVE,    // 待收货
    DONE                    // 结束
}
  • OrderEvents
public enum OrderEvents {
    PAY,        // 支付
    RECEIVE     // 收货
}

3.将状态与事件进行绑定:(StateMachineConfig)

​

@Configuration
@EnableStateMachine(name = "StateMachineConfig")
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<TestState, TestEvents> {

    private Logger logger = LoggerFactory.getLogger(getClass());
    //定义初始状态
    @Override
    public void configure(StateMachineStateConfigurer<TestState, TestEvents> states)
    throws Exception {
        states
        .withStates()
        .initial(TestState.UNPAID)
        .states(EnumSet.allOf(TestState.class));
    }
    //状态转换过程 触发什么事件就转换为什么状态
    @Override
    public void configure(StateMachineTransitionConfigurer<TestState, TestEvents> transitions)
    throws Exception {
        transitions
        .withExternal()
        .source(TestState.UNPAID).target(TestState.WAITING_FOR_RECEIVE)
        .event(TestEvents.PAY)
        .and()
        .withExternal()
        .source(TestState.WAITING_FOR_RECEIVE).target(TestState.DONE)
        .event(TestEvents.RECEIVE);
    }
}

​

4.将事件监听触发与配置类进行配置:(EventListener)

​

@Component
@WithStateMachine(name = "StateMachineConfig")
public class EventListener {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @OnTransition(target = "UNPAID")
    public boolean create(Message<Order> order) {
        // 创建订单逻辑
        logger.info("订单创建,待支付");
        return true;
    }

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求