10 分钟带你体验 Solon 的状态机
一、介绍
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();
}
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
为何精神控制类 Prompt 远胜普通事务性 Prompt?
研究人员发起了主题"为何精神控制类Prompt远胜普通事务性Prompt"的研究,他们通过大量实验数据直观展示两类Prompt在关键指标上的显著差异。 以下数据基于最新公开文献(IJCAI-2024、ACL-2025、arXIV-2024等)与作者实测,覆盖多个维度评估。 最终得出如下结论: 精神控制类 Prompt ≈ 把 RLHF 阶段学到的"人类情绪映射"重新激活,并叠加稀缺、竞争、权威三重杠杆,从而把 LLM 的生成分布强行压到高 reward 区域——这就是它碾压普通事务性 Prompt 的全部秘密。
-
下一篇
鸿蒙开发 Hvigor 插件动态生成代码
踏入鸿蒙世界的敲门砖,标志着您在技术征途上的全新起点,提升就业竞争力,获得行业认可,点亮职业成长先机,快人一步抢占未来应用开发赛道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398?ha_source=hmosclass-bokeyuan&ha_sourceId=89000444 Hvigor允许开发者实现自己的插件,开发者可以定义自己的构建逻辑,并与他人共享。Hvigor主要提供了两种方式来实现插件:基于hvigorfile脚本开发插件、基于typescript项目开发。下面以基于hvigorfile脚本开发插件进行介绍。 基于hvigorfile脚本开发 基于hvigorfile.ts脚本开发的方式,其优点是可实现快速开发,直接编辑工程或模块下hvigorfile.ts即可编写插件代码,不足之处是在多个项目中,无法方便的进行插件代码的复用和共享分发。 1、导入模块依赖。 2、编写插件代码。 在hvigorfile.ts中定义插件方法,实现HvigorPl...
相关文章
文章评论
共有0条评论来说两句吧...