一、介绍

Solon 状态机,称为 Solon State Machine。它是一种可以管理状态、事件之间的关系,以及他们之间的转换。这是一个专门为应用程序中的状态管理和状态转换提供支持的框架。

它简化了事物对象在不同状态下,不同事件转化的代码管理,让其代码变得更加清晰明了。

本文将介绍 Solon State Machine 状态机在 Solon 框架下的使用,10分钟带你理解并上手使用 Solon 状态机

二、状态机的核心概念

首先,我们必须要了解 Solon 状态机的几个核心概念,如下

  • 状态(State):代表着对象的当前状态
  • 事件(Event):对象状态转变是因何而改变的
  • 转换(Transition):定义了事物的状态是通过哪个事件变到了另一个状态

比如,最常见的就是订单系统,下面就简单模拟一下正常订单的状态流转:

  • 用户下单(状态为:待支付)
  • 用户支付成功(状态为:已支付待发货)
  • 仓库已发货(状态为:已发货待收货)
  • 用户成功收货(状态为:已收货)

三、代码

添加对应的 maven 依赖

<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-statemachine</artifactId>
<version>3.5.1</version>
</dependency>

对于状态,由于非常固定,我们最好是使用枚举,如下OrderStatus.java

public enum OrderStatusEnum {
WAIT_PAY, //待支付
WAIT_DELIVER, //已支付待发货
WAIT_RECEIVE, //已发货待收货
RECEIVED; //已收货
}

还要定义一下事件的枚举

public enum OrderStatusEventEnum {
ORDER, //用户下单
PAY, //用户支付成功
DELIVER, //仓库已发货
RECEIVE; //用户成功收货
}

接下来我们就能定义转换了,在 Solon 框架下,我们可以定义一个 OrderStateMachine 托管类

@Managed
public class OrderStateMachine extends StateMachine<OrderStatusEnum,OrderStatusEventEnum, OrderEntity> {
public OrderStateMachine() {
// 待支付 -> 已支付待发货(支付成功)
from(OrderStatusEnum.WAIT_PAY).to(OrderStatusEnum.WAIT_DELIVER)
.on(OrderStatusEventEnum.PAY)
.then(c -> c.getPayload().setStatus(c.getTo())); // 已支付待发货 -> 已发货待收货(仓库已发货)
from(OrderStatusEnum.WAIT_DELIVER).to(OrderStatusEnum.WAIT_RECEIVE)
.on(OrderStatusEventEnum.DELIVER)
.then(c -> c.getPayload().setStatus(c.getTo())); // 已发货待收货 -> 已收货(用户收货)
from(OrderStatusEnum.WAIT_RECEIVE).to(OrderStatusEnum.RECEIVED)
.on(OrderStatusEventEnum.RECEIVE)
.then(c -> c.getPayload().setStatus(c.getTo()));
}
}

是不是感觉还缺了什么呢,配置中还缺少一个下单事件,这没有关系,这是我们初始的一个事件,不参于配置

我们写对应的 OrderController 接口即可,这边模拟一下,创建订单进行落库

@Controller
public class OrderController {
@Mapping("/create")
public Result<Void> create() {
// TODO 模拟订单落库
return Result.succeed();
}
}

重点是在后面的,支付这一个阶段,我们应该如何接入状态机,如下

@Controller
public class OrderController {
@Inject
private OrderStateMachine orderStatusMachine; @Mapping("/create")
public Result create() {
// TODO 模拟订单落库
return Result.succeed();
} @Post
@Mapping("/pay")
public Result pay() {
// TODO 模拟订单支付
return Result.succeed();
} @Post
@Mapping("/payNotify")
public Result payNotify(Integer orderId) {
// TODO 支付成功后,使用状态机 // 模拟通过id查找一个订单对象
OrderEntity entity = new OrderEntity(orderId, OrderStatusEnum.WAIT_PAY); // 使用状态机发送这个消息
orderStatusMachine.sendEvent(OrderStatusEventEnum.PAY, EventContext.of(entity.getStatus(), entity));
return Result.succeed();
}
}

10分钟带你体验 Solon 的状态机的更多相关文章

  1. 10分钟带你徒手做个Java线程池

    摘要:花10分钟开发一个极简版的Java线程池,让小伙伴们更好的理解线程池的核心原理. 本文分享自华为云社区<放大招了,冰河带你10分钟手撸Java线程池,yyds,赶快收藏吧>,作者:冰 ...

  2. Azure IoT Hub 十分钟入门系列 (1)- 10分钟带你了解Azure IoT Hub 并创建IoT Hub

    建议您先对<Azure 上 IoT 整体解决方案概览 >进行了解. 本文主要分享一个案例: 10分钟-了解Azure IoT Hub并创建Azure IoT Hub 本文主要有如下内容: ...

  3. 都9102年了,还不会Docker?10分钟带你从入门操作到实战上手

    Docker简述 Docker是一种OS虚拟化技术,是一个开源的应用容器引擎.它可以让开发者将应用打包到一个可移植的容器中,并且该容器可以运行在几乎所有linux系统中(Windows10目前也原生支 ...

  4. 干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码

    OUTLINE 前言 预备知识预警 什么是column generation 相关概念科普 Cutting Stock Problem CG求解Cutting Stock Problem 列生成代码 ...

  5. 干货 | 10分钟带你全面掌握branch and bound(分支定界)算法-概念篇

    00 前言 之前一直做启发式算法,最近突然对精确算法感兴趣了.但是这玩意儿说实话是真的难,刚好boss又叫我学学column generation求解VRP相关的内容.一看里面有好多知识需要重新把握, ...

  6. 10分钟带你入门git到github

    git的产生背景 开局先来一个故事吧,故事看完如果不想看枯燥无味的指令,没关系我已经把这篇文章的内容录制成了一个视频,点击文末阅读原文就可以观看.或者说你已经熟练掌握git的使用了,可以直接跳到总结部 ...

  7. 10分钟带你进入Swagger的世界,快来看一看吧

    什么是Swagger? 如下引用swagger官方的解释 Swagger is a powerful yet easy-to-use suite of API developer tools for ...

  8. 干货 | 10分钟带你掌握branch and price(分支定价)算法超详细原理解析

    00 前言 相信大家对branch and price的神秘之处也非常好奇了.今天我们一起来揭秘该算法原理过程.不过,在此之前,请大家确保自己的branch and bound和column gene ...

  9. 10分钟学会Less开发环境搭建与初体验

    Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. 今天看一下,10分钟能不能手把手快速教会你Le ...

  10. Apache Shiro系列三,概述 —— 10分钟入门

     一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ...

随机推荐

  1. Java 内存模型与 Happens-Before 关系深度解析

    在 Java 并发编程中,Java 内存模型(Java Memory Model, JMM)与 Happens-Before 关系是理解多线程数据可见性和有序性的核心理论.本文从 JMM 的抽象模型出 ...

  2. [书籍精读]《CSS世界》精读笔记分享

    写在前面 书籍介绍:本书从前端开发人员的需求出发,以"流"为线索,从结构.内容到美化装饰等方面,全面且深入地讲解前端开发人员必须了解和掌握的大量的CSS知识点.同时,作者结合多年的 ...

  3. 直播预约丨《袋鼠云大数据实操指南》No.2:实时开发,如何成为数据智能化的有效驱动力

    近年来,新质生产力.数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕. 面对这些引领经济转型的新兴概念,为了 ...

  4. DRF之过滤类源码分析

    DRF之过滤类源码分析 [一]过滤类介绍及BaseFilterBackend Django REST framework(DRF)中的过滤类允许你在API视图中对查询进行过滤,以根据特定条件筛选结果集 ...

  5. springboot~入门第二篇~页面html跳转~

    遇到的问题:按照别人的blog搭jsp页面就是html页面跳转不了,总是如图: 终于找到了一个能用的blog ,换 thymeleaf(html页面跳转)成功. 控制器代码 注意下: @Control ...

  6. CPU的几核几线程是什么意思?

    前言 经常看到 电脑硬件的配置参数上 是这么标注cpu的 是不是不太明白 是什么意思? 命名 每个cpu型号都有自己名字,比如上边举例的那款叫做 i5-12600k i5指得是 英特尔公司把自家cpu ...

  7. 使用IntelliJ IDEA 配置Maven项目

    今天准备写个Java Web项目,决定用新安装的IntelliJ IDEA来试试,毕竟听别人说这个IDEA管理Maven项目比Eclipse方便,于是乎在网上找到了一篇超级有用的入门级配置教程,接下来 ...

  8. vs 运行 qt 项目的注意事项

    简介 RT 1 使用vs 打开 qt 项目 https://blog.csdn.net/weixin_44840658/article/details/99693803 2 运行项目之后 会因为缺少相 ...

  9. 深度解密:Win11 22000.100界面更美观、更顺手

    微软官方面向Dev通道的Insider会员又推送Windows 11新预览版系统了,操作系统版本号升级为Build 22000.100. 这是Windows 11预览版上线以来的第四次累积更新,微软继 ...

  10. (译) 理解 Prometheus 的范围向量 (Range Vector)

    Prometheus 中 Range Vector 的概念是有一点不直观的,除非你彻底阅读并理解了官方提供的文档.谁会这样做呢,去读官方文档?大多的人应该会花些错误的时间去做了一些错误的事情,然后随机 ...