您现在的位置是:首页 > 文章详情

10 分钟带你体验 Solon 的状态机

日期:2025-08-25点击:32

一、介绍

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.0</version> </dependency> 

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

 import org.noear.solon.statemachine.State; public enum OrderStatusEnum implements State{ WAIT_PAY, //待支付 WAIT_DELIVER, //已支付待发货 WAIT_RECEIVE, //已发货待收货 RECEIVED; //已收货 } 

还要定义一下事件的枚举

 import org.noear.solon.statemachine.Event; public enum OrderStatusEventEnum implements Event{ ORDER, //用户下单 PAY, //用户支付成功 DELIVER, //仓库已发货 RECEIVE; //用户成功收货 } 

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

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

 

原文链接:https://www.oschina.net/news/368288
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章