Solon StateMachine 实现状态机使用示例详解
什么是状态机
状态机是计算机科学中的核心建模工具,用于描述对象在其生命周期内状态变化的逻辑模型。它通过定义有限状态集合、状态转移规则和触发事件,精确控制系统的行为逻辑。
Solon StateMachine 是 Solon Framework 提供的一个功能强大的状态机框架,可实现复杂的工作流、订单管理等需要状态流转的场景。通过对状态、事件和转移的管理,开发者能够构建出简洁而灵活的状态机逻辑。
使用示例
1、导入maven依赖
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-statemachine</artifactId>
<version>3.5.0</version>
</dependency>
2、创建订单状态枚举类
import org.noear.solon.statemachine.State;
public enum OrderStatus implements State{
WAITING_PAYMENT,//待支付
WAITING_RECEIVE,//待取货
FINISHED,//已完成
CANCELED;//已取消
}
3、创建订单转悠事件枚举类
import org.noear.solon.statemachine.Event;
public enum OrderEvent implements Event {
CREATE_ORDER,//创建订单
PAY_ORDER,//支付订单
RECEIVE_ORDER,//取货
CANCEL_ORDER,//取消订单
FINISH_ORDER//完成订单
}
4、创建订单实体,并实现 EventContext 接口(也可以不实现,改用 EventContext.of(...))
public class Order implements EventContext<OrderStatus, Order> {
private final String orderId;
private OrderStatus status;
public Order(String orderId, OrderStatus status) {
this.orderId = orderId;
this.status = status;
}
public String getOrderId() {
return orderId;
}
public OrderStatus getStatus() {
return status;
}
public void setStatus(OrderStatus status) {
this.status = status;
}
// for EventContext
@Override
public OrderStatus getCurrentState() {
return status;
}
@Override
public Order getPayload() {
return this;
}
}
5、定义订单状态机组件,并添加状态转移规则。这里是重点了
Solon StateMachine 不管理当前状态,不涉及持久化。具有可复用、多线程安全特性。
import org.noear.solon.annotation.Managed;
import org.noear.solon.statemachine.StateMachine;
@Managed
public class OrderStateMachine extends StateMachine<OrderStatus, OrderEvent,Order> {
public OrderStateMachine() {
// 订单待支付 -> 待取货
addTransition(t -> t
.from(OrderStatus.WAITING_PAYMENT)
.to(OrderStatus.WAITING_RECEIVE)
.on(OrderEvent.PAY_ORDER)
.then(c -> c.getPayload().setStatus(c.getTo())));
// 订单待取货 -> 已完成
addTransition(t -> t
.from(OrderStatus.WAITING_RECEIVE)
.to(OrderStatus.FINISHED)
.on(OrderEvent.FINISH_ORDER)
.then(c -> c.getPayload().setStatus(c.getTo())));
// 订单待支付 -> 已取消
addTransition(t -> t
.from(OrderStatus.WAITING_PAYMENT)
.to(OrderStatus.CANCELED)
.on(OrderEvent.CANCEL_ORDER)
.then(c -> c.getPayload().setStatus(c.getTo())));
}
}
6、创建调用示例服务
Solon StateMachine 在发送事件时,通过 EventContext 传递当前状态和装载。
@Managed
public class OrderService {
@Inject
private OrderStateMachine orderStateMachine;
//支付
public Order pay() {
Order order = new Order("1", OrderStatus.WAITING_RECEIVE);
System.out.println("尝试支付,订单号:" + order.getOrderId());
try {
//事件: 支付, 状态转换:待支付 → 待发货
orderStateMachine.sendEvent(OrderEvent.PAY_ORDER, order);
System.out.println("支付成功,订单号:" + order.getOrderId());
} catch (Exception ex) {
System.out.println("支付失败, 状态异常,订单号:" + order.getOrderId());
}
return order;
}
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Meta 陷入史上最大 AI 训练数据侵权案,面临 3.59 亿美元索赔
美国加利福尼亚州法院最近受理的一起诉讼案件,将全球科技巨头Meta推到了舆论的风口浪尖。两家成人影片制作公司Strike3和Counterlife Media的联合起诉,不仅揭露了AI训练背后的数据获取黑幕,更以高达3.59亿美元的索赔金额,为整个科技行业敲响了版权保护的警钟。 这起诉讼的核心指控令人震惊。根据法庭文件显示,Meta公司自2018年以来一直在明知故犯地从盗版来源下载受版权保护的影片内容,累计涉及至少2396部作品。这些非法获取的视频资料被用于训练包括Meta Movie Gen视频生成模型和LLaMA语言大模型在内的多种AI系统,为Meta的人工智能技术发展提供了重要的数据支撑。 更加令人意外的是Meta获取这些内容的方式。起诉文件详细披露,Meta并非简单地下载这些盗版内容,而是主动利用BitTorrent文件共享技术进行大规模的非法内容获取。这种P2P下载方式的特殊之处在于,下载者同时也会成为内容的分发者,通过"种子"技术向网络中的其他用户传播相同的文件。 Meta选择这种下载方式绝非偶然。BitTorrent协议的核心优势在于其分布式下载机制能够显著提升大文件的传...
-
下一篇
鸿蒙元应用与卡片使用 @LocalStorageProp 进行通讯的技术分享
踏入鸿蒙世界的敲门砖,标志着您在技术征途上的全新起点,提升就业竞争力,获得行业认可,点亮职业成长先机,快人一步抢占未来应用开发赛道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398?ha_source=hmosclass-bokeyuan&ha_sourceId=89000444 在鸿蒙系统(HarmonyOS)的开发中,@LocalStorageProp 是一个非常有用的装饰器,用于在组件之间共享状态或数据。特别是在卡片(Card)和元服务(Meta Service)之间进行通讯时,@LocalStorageProp 可以帮助我们实现数据的持久化和同步。本文将通过一个具体的案例,详细介绍如何使用 @LocalStorageProp 进行通讯。 1、案例背景 假设我们正在开发一个幸运号生成器应用,其中包含一个卡片组件 LotteryNumbersWidgetCard。这个卡片组件需要显示生成的幸运号码,并且这些号码需要在不同的卡片实例之间共享。为了实现这一功能...
相关文章
文章评论
共有0条评论来说两句吧...