Spring StateMachine状态机

一、状态机

有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在电商场景(订单、物流、售后)、社交(IM消息投递)、分布式集群管理(分布式计算平台任务编排)等场景都有大规模的使用。

状态机的要素:

状态机可归纳为4个要素,现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。

1 现态:指当前所处的状态
2 条件:又称“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移
3 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必须的,当条件满足后,也可以不执行任何动作,直接迁移到新的状态。
4 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转换成“现态”。

状态机动作类型:

进入动作:在进入状态时进行
退出动作:在退出状态时进行
输入动作:依赖于当前状态和输入条件进行
转移动作:在进行特定转移时进行

二、spring statemachine

spring statemachine是使用 Spring框架下的状态机概念创建的一种应用程序开发框架。它使得状态机结构层次化,简化了配置状态机的过程。
官方文档:https://docs.spring.io/autorepo/docs/spring-statemachine/1.0.0.M3/reference/htmlsingle/#sm-stateconte

例子一:简单订单流程

Spring StateMachine状态机
使用过程:

1 引入依赖

2 创建订单状态枚举类和状态转换枚举类

3 添加配置

4 添加订单状态监听器

5 service中使用

6 测试

例子二:状态机工厂

有些时候,一个状态机不够用,因为我们可能要处理多个订单。这个时候就要用到了状态机工厂。

1 配置修改

2 service中使用

<span class="hljs-annotation">@Service(<span class="hljs-string">"orderService")
<span class="hljs-keyword">public <span class="hljs-class"><span class="hljs-keyword"><span class="hljs-keyword">class <span class="hljs-title"><span class="hljs-title">OrderServiceImpl <span class="hljs-keyword"><span class="hljs-title">implements <span class="hljs-title"><span class="hljs-title">OrderService {

    <span class="hljs-annotation">@Autowired
    <span class="hljs-keyword">private OrderMapper orderMapper;

</span></span></span></span></span></span></span></span></span></span></span></span></span></span>

3 listener中配置id

@Component(<span class="hljs-string">"orderStateListener")
@WithStateMachine(id = OrderStateMachineConfig<span class="hljs-preprocessor">.orderStateMachineId)
<span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title">OrderStateListenerImpl {

    @OnTransition(source = <span class="hljs-string">"WAIT_PAYMENT", target = <span class="hljs-string">"WAIT_DELIVER")
    <span class="hljs-function"><span class="hljs-keyword">public boolean <span class="hljs-title">payTransition(<span class="hljs-params">Message<orderstatuschangeevent> message) {
        System<span class="hljs-preprocessor">.<span class="hljs-keyword">out<span class="hljs-preprocessor">.println(<span class="hljs-string">"----------------------------")</span></span></span></span></orderstatuschangeevent></span></span></span></span></span></span></span></span></span></span></span>

转自 https://www.codetd.com/article/1010726

Original: https://www.cnblogs.com/xd502djj/p/15906917.html
Author: 茄子_2008
Title: Spring StateMachine状态机

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540791/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java—-零钱通项目

    Java—-零钱通项目 项目要求:使用 Java 开发 零钱通项目 , 可以完成收益入账,消费,查看明细,退出系统等功能。 1. 面向过程 1)首先是这样一个菜单界面 …

    Java 2023年6月8日
    082
  • java.sql.SQLSyntaxErrorException: Unknown database报错

    一般是jdbc链接的数据库名字写错了,检查数据库的名字。 Original: https://www.cnblogs.com/333czh/p/15622694.htmlAutho…

    Java 2023年6月9日
    079
  • 1.Elasticsearch介绍

    内容拷贝:https://blog.csdn.net/jiayoubaobei2/article/details/125882986 1. Elasticsearch概述 1.1 …

    Java 2023年6月5日
    0100
  • 2022-8-16 mysql 第二天 约束

    重点,DQL是我们每天都要接触编写最多也是最难的SQL,该语言用来查询记录,不会修改数据库和表结构。 构建数据库 创建一张student表: DROP TABLE IF EXIST…

    Java 2023年6月13日
    077
  • 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

    在项目的lib和tomcat的lib目录下分别增加所需的JSTLjar文件然后重启项目 Original: https://www.cnblogs.com/recorderM/p/…

    Java 2023年6月5日
    080
  • Git命令集锦

    Git命令集锦 前言 正文 主体git操作 TEST 列出所有本地分支: git branch 列出所有远程分支: git branch -r 列出所有本地分支和远程分支: git…

    Java 2023年6月5日
    092
  • 利用 XXL-JOB 实现灵活控制的分片处理

    本文讲述了一种利用 XXL-JOB 来进行分片任务处理的方法,另外加入对执行节点数的灵活控制。 场景 现在一张数据表里有大量数据需要某个服务端应用来处理,要求: 能够并行处理; 能…

    Java 2023年6月5日
    090
  • SpringBoot-MVC自动配置原理

    MVC自动配置原理 5.1 官网阅读 在进行项目编写前,我们还需要知道一个东西,就是SpringBoot对我们的SpringMVC还做了哪些配置,包括如何扩展,如何定制。 只有把这…

    Java 2023年6月5日
    0131
  • (动态规划)最长递增子列

    先来看问题, 最长递增子列。 即数组中按顺序拿出n个数,(按照原来的顺序)该子数列为递增数列。 例如:1 2 3 -1数列最后结果为3.最对应数列很显然为1 2 3 (注,只输出长…

    Java 2023年6月5日
    074
  • IO多路复用

    先说明一个问题:在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。网络编程其实就是多了一个连接的过程,常用在Netty一些框架。本文主要…

    Java 2023年6月7日
    0114
  • 反射 构造函数 参数

    引用:http://xiaohuafyle.iteye.com/blog/1607258 通过反射创建新的类示例,有两种方式:Class.newInstance()Construc…

    Java 2023年5月30日
    075
  • idea中搭建ssm框架,详细步骤

    转载 https://www.cnblogs.com/mufengforward/p/9198612.html Original: https://www.cnblogs.com/…

    Java 2023年6月5日
    087
  • MyBatis保姆级理解与使用,动态SQL(核心)

    动态S QL(核心) 1.1 简介 Mybatis 框架的动态SQL 技术是一种根据特定条件动态拼装SQL 语句的功能,它存在的意义是为了解决拼接SQL 语句字符串时的难点问题。 …

    Java 2023年6月16日
    052
  • 全能代码生成器,自动生成前后端代码、生成项目框架、生成JavaBean、生成数据库文档、自动化部署项目(TableGo v8.0.0)

    TableGo_20220801 v8.0.0 正式版发布,此次版本累计更新如下:1、生成项目功能新增支持若依框架,可同时生成若依框架代码和所有业务表的前后端基础CRUD代码,一键…

    Java 2023年6月9日
    093
  • 面向对象ooDay9

    同一个对象被造型为不同的类型时,有不同的功能——-所有对象都是多态的(明天总结详细讲) 对象的多态:水、我、你…… 同一类型的引用在…

    Java 2023年6月13日
    072
  • MySQL、Oracle元数据抽取分析

    最近接到个任务是抽取mysql和Oracle的元数据,大致就是在库里把库、schema、表、字段、分区、索引、主键等信息抽取出来,然后导成excel。 因为刚开始接触元数据,对这个…

    Java 2023年6月5日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球