`

spring 状态机使用

 
阅读更多

业务中经常会遇到状态变更的场景

比如在外卖订单配送场景中,常有这样的业务:

骑手接单动作,会触发配送状态从 待结单 ->等待配送

骑手配送动作,会触发配送状态从 配送中->配送完成

针对如上的场景我们可以使用状态机来处理

spring 提供了状态机的使用,官方文档地址:https://spring.io/projects/spring-statemachine#learn

 

现在来做个简单介绍如何使用

 

一、添加依赖

目前使用的版本是 2.4.0

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.statemachine</groupId>
            <artifactId>spring-statemachine-starter</artifactId>
            <version>${spring.statemachine.version}</version>
        </dependency>

 

二、需要定义自己的业务场景的动作和状态枚举值

 

动作枚举

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum EventEnum {
    DELIVERY_CONFIRM(1,"骑手接单"),
    DELIVERY_START(2,"开始配送");
    private int value;
    private String desc;

}

 

状态枚举

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public enum StateEnum {
    WAIT_DELIVER_RECEIVE(1,"等待骑手接单"),
    WAIT_START_DELIVERY(2,"等待骑手配送"),
    DELIVERY_END(3,"配送完成");

    private int value;
    private String desc;

}

 

三、添加配置

import com.example.demo.enums.EventEnum;
import com.example.demo.enums.StateEnum;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.EnableStateMachine;
import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
import org.springframework.statemachine.listener.StateMachineListener;
import org.springframework.statemachine.listener.StateMachineListenerAdapter;
import org.springframework.statemachine.state.State;

import java.util.EnumSet;

@Configuration
@EnableStateMachine
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<StateEnum, EventEnum> {


    /**
     * 配置信息
     * @param config
     * @throws Exception
     */
    @Override
    public void configure(StateMachineConfigurationConfigurer<StateEnum, EventEnum> config) throws Exception {
        config.withConfiguration()
                .autoStartup(true)
                .listener(listener());
    }


    @Override
    public void configure(StateMachineStateConfigurer<StateEnum, EventEnum> states) throws Exception {
        states.withStates()
                .initial(StateEnum.WAIT_DELIVER_RECEIVE) //初始化状态是等待骑手接单
                .states(EnumSet.allOf(StateEnum.class));
    }


    /**
     * 状态流转
     * @param transitions
     * @throws Exception
     */
    @Override
    public void configure(StateMachineTransitionConfigurer<StateEnum, EventEnum> transitions) throws Exception {
        transitions.withExternal()
                .source(StateEnum.WAIT_DELIVER_RECEIVE).target(StateEnum.WAIT_START_DELIVERY).event(EventEnum.DELIVERY_CONFIRM) // 骑手接单动作触发 等待骑手接单状态 到 等待骑手配送
                .and().withExternal()
                .source(StateEnum.WAIT_START_DELIVERY).target(StateEnum.DELIVERY_END).event(EventEnum.DELIVERY_START);// 骑手配送动作触发 等待骑手配送状态 到 是配送完成
    }

    /**
     * 监听器
     * @return
     */
    @Bean
    public StateMachineListener<StateEnum, EventEnum> listener() {
        return new StateMachineListenerAdapter<StateEnum,EventEnum>(){
            @Override
            public void stateChanged(State<StateEnum, EventEnum> from, State<StateEnum, EventEnum> to) {
                if(null != from && null != to){
                    System.out.println("当前状态:"+from.getId().getDesc() +"-->变更到:"+to.getId().getDesc());
                }
            }
        };
    }
}

 

 

测试

import com.example.demo.enums.EventEnum;
import com.example.demo.enums.StateEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.statemachine.StateMachine;
import org.springframework.stereotype.Service;

@Service
public class DoStateMachine implements CommandLineRunner {

    @Autowired
    private StateMachine<StateEnum, EventEnum> stateMachine;
    @Override
    public void run(String... args) throws Exception {
        stateMachine.start();
        stateMachine.sendEvent(EventEnum.DELIVERY_CONFIRM);
        stateMachine.sendEvent(EventEnum.DELIVERY_START);
    }
}

 

输出内容如下:

当前状态:等待骑手接单-->变更到:等待骑手配送

当前状态:等待骑手配送-->变更到:配送完成

 

 

 

 

分享到:
评论

相关推荐

    StateMachine 状态机机制深入解析

    StateMachine 状态机机制是指在软件开发中,使用状态机来描述和处理复杂的业务流程。状态机机制可以帮助开发者简化状态机的开发过程,并且可以提高代码的可读性和维护性。在 Spring 框架中,StateMachine 状态机机制...

    spring 状态机示例.rar

    Spring 状态机(State Machine)是 Spring 框架中的一个强大工具,它允许开发者创建和管理复杂的对象状态转换系统。在实际开发中,状态机常用于处理具有多个可变状态且状态之间存在明确转换规则的业务场景,例如订单...

    管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程.doc

    然而,对于许多开发人员来说,状态机的实现往往伴随着代码复杂和难以理解的问题,特别是在Spring StateMachine等框架使用中,对开发者要求较高,容易出现线程安全问题。因此,发现并掌握一个轻量级、线程安全且简单...

    sm-demo:Spring Boot状态机演示

    Spring State Machine演示-讨价还价 基于简单演示应用程序 详细说明 截屏 安装 您需要预先安装Java11。 然后,您可以将其作为常规的Spring Boot Web应用程序运行。 $ ./mvnw spring-boot:run 徽章 执照

    Spring Statemachine 项目,旨在提供一个通用的基础设施,在 Spring 应用程序中使用状态机概念

    Spring Statemachine 项目旨在提供一个通用的基础设施,以便在 Spring 应用程序中使用状态机概念。示例可以在 spring-statemachine-samples 下找到。查看参考文档,详细了解它们的作用。

    应用程序开发框架SpringStatemachine.zip

    Spring Statemachine (Spring 状态机)是使用 Spring 框架下的状态机概念创建的一种应用程序开发框架。它使得状态机结构层次化,简化了配置状态机的过程。详细功能:Easy to use flat one level state machine for ...

    simple-state-machine:一个用于Spring Boot项目的简单Java状态机

    简单状态机Spring Boot 项目的简单状态机导入到像 STS 这样的 IDE 后,可以作为 Spring Boot 应用程序运行。 该项目包含一个框架和一个框架的使用说明,用于示例项目,如在线订单处理。用法初始状态活动前处理器事后...

    利用Spring State Machine构建简单订单状态机实现案例(包含详细的完整的程序和数据)

    内容概要:本文详细介绍了一个如何利用Spring State Machine为订单处理业务创建状态机的具体步骤。从项目的初始环境搭建开始逐步介绍整个状态机系统的创建方法及其API使用,包括项目结构设定、状态与事件定义、状态...

    spring-statemachine:Spring Statemachine是一个框架,供应用程序开发人员在Spring中使用状态机概念

    Spring Statemachine 是一个由 Spring 社区开发的框架,它为Java应用程序提供了强大的状态机抽象。这个框架使得开发者能够在Spring环境中轻松地实现和管理状态转换逻辑,从而简化复杂的工作流程和业务逻辑。让我们...

    spring-statemachine-2.02.release源码

    1. **状态机模型**:Spring StateMachine 基于 UML 状态图模型,包括状态(State)、事件(Event)、转换(Transition)和行为(Action)。每个状态可以包含子状态,事件触发状态间的转换,而行为则在转换过程中执行...

    spring boot+redis单机与集群.zip

    对于初学者,这将是一个很好的实践指南,而对于有经验的开发者,也可以从中学习如何优化和扩展Redis在Spring Boot项目中的使用。通过学习和实践,你可以更深入地理解Spring Boot的自动化配置原理,以及如何在分布式...

    spring boot 全面的样例代码

    - chapter6-1-1:[使用Spring StateMachine框架实现状态机](http://blog.didispace.com/spring-statemachine/) - [Spring Boot Actuator监控端点小结](http://blog.didispace.com/spring-boot-actuator-1/) - [在...

    [] - 2023-09-25 告别复杂逻辑,项目终于用上了 Spring 状态机,非常优雅!.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    spring web flow reference 2.4.0

    Spring Web Flow采用了一种基于状态机的设计模式来定义流程,每个流程都由一系列的状态组成。这些状态包括`view-state`、`transition`、`end-state`等。 ##### 3.2 流程定义 - **flow**:定义一个Flow的基本结构,...

    spring web flow入门

    Spring Web Flow通过引入状态机的概念来改善页面流程的管理。它将页面流程视为一系列状态的集合,每个状态可以是显示视图、执行动作或进行某种处理的点。状态之间的转换则通过事件触发,从而形成清晰、可预测的流程...

    spring cloud 中文文档

    - **Spring RestTemplate作为负载平衡器客户端**:演示了如何使用Spring RestTemplate实现客户端负载均衡。 - **多个RestTemplate对象**:介绍了如何配置多个RestTemplate实例以满足不同的HTTP请求需求。 - **忽略...

    springCloud

    Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种...

    Spring-WebFlow入门中文文档

    它使用状态机模型来表示页面流程,每个状态代表一个特定的页面或操作,状态之间的转换由事件触发。通过这种方式,流程的生命周期可以跨越多个请求,但比整个会话更短,更适合处理复杂的用户交互。 Spring Web Flow ...

    第三章 SpringCloud 使用Erueak服务注册中心.pdf

    SpringCloud提供了Ribbon组件,它可以和Eureka结合使用,实现客户端负载均衡。此外,还可以通过配置Eureka客户端参数,如超时时间、重试机制等,优化服务调用的性能和稳定性。 6. 总结 SpringCloud通过集成Eureka...

Global site tag (gtag.js) - Google Analytics