什么是状态机

状态机是计算机科学中的核心建模工具,用于描述对象在其生命周期内状态变化的逻辑模型。它通过定义有限状态集合状态转移规则触发事件,精确控制系统的行为逻辑。

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;
}
}

Solon StateMachine 实现状态机使用示例详解的更多相关文章

  1. jquery移除、绑定、触发元素事件使用示例详解

    这篇文章主要介绍了jquery移除.绑定.触发元素事件使用示例详解,需要的朋友可以参考下. unbind(type [,data]) //data是要移除的函数 $('#btn').unbind(&q ...

  2. gcc与g++的编译链接的示例详解

    一.编译方式的示例详解 1. 编译C代码 代码如下:main.c /*!  ************************************************************** ...

  3. 史上最易懂——ReactNative分组列表SectionList使用详情及示例详解

    React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...

  4. Spring Boot 2.x 快速入门(下)HelloWorld示例详解

    上篇 Spring Boot 2.x 快速入门(上)HelloWorld示例 进行了Sprint Boot的快速入门,以实际的示例代码来练手,总比光看书要强很多嘛,最好的就是边看.边写.边记.边展示. ...

  5. VS2010 Chart控件(一)Chart控件在ASP.NET网站中的应用示例详解(C#语言)

    步骤如下: 1. Chart控件(一)Chart控件在ASP.NET网站中的应用示例详解(C#语言)" title="VS2010 Chart控件(一)Chart控件在ASP.NE ...

  6. socket编程的同步、异步与阻塞、非阻塞示例详解

     socket编程的同步.异步与阻塞.非阻塞示例详解之一  分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序 ...

  7. String.format()【示例详解】

    String.format()[示例详解] 整理者:Vashon 前言: String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.fo ...

  8. SpringBoot与PageHelper的整合示例详解

    SpringBoot与PageHelper的整合示例详解 1.PageHelper简介 PageHelper官网地址: https://pagehelper.github.io/ 摘要: com.gi ...

  9. python中的tcp示例详解

    python中的tcp示例详解  目录 TCP简介 TCP介绍 TCP特点 TCP与UDP的不同点 udp通信模型 tcp客户端 tcp服务器 tcp注意点   TCP简介   TCP介绍 TCP协议 ...

  10. 在java poi导入Excel通用工具类示例详解

    转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36   作者:daochuwenziyao   我要评论   这篇文章主要给大家介绍了关于在j ...

随机推荐

  1. Springboot笔记<8>异常处理 文件上传

    文件上传 springboot可以直接使用 org.springframework.web.multipart.MultipartFile实现文件上传功能. 1.创建form表单: <!DOCT ...

  2. tkinter使用pyinstaller 打包报错,ModuleNotFoundError: No module named ‘babel.numbers‘

    @ 目录 报错原因 解决办法 报错原因 导入的tkcalendar 包 中,模块名与原生的冲突 from tkcalendar import DateEntry 解决办法 打包时加入参数--hidde ...

  3. 一个基于 .NET 开源、模块化 AI 图像生成 Web 用户界面

    前言 今天大姚给大家分享一个基于 .NET 开源.模块化 AI 图像生成 Web 用户界面:SwarmUI. 项目介绍 SwarmUI (原 StableSwarmUI)是一个基于 .NET 开源(M ...

  4. CRM AET增强字段太多导致表字段长度超长 NOTE 1392239

  5. 如何基于three.js(webgl)引擎架构,实现3D机房园区,数据中心消防系统

    前言前面的文章我们已经详细介绍了数据中心机房的关键知识点,以及消防领域的基础知识.在此基础上,本文将深入探讨展示消防在数据中心这一特殊场景中的应用,特别是气体消防系统的应用模拟及发生火灾时逃生路径规划 ...

  6. DateValue转换日期文本的一个注意问题

    Excel 中,DateValue转换日期文本,遇到欧式日期格式:"17 Jun 2025"或"Jun 17, 2025"这样的日期需要转换时,一定要注意,日. ...

  7. 使用 Firefox (火狐)浏览器 必开的配置

    首先,在网址输入框中输入 about:config 进入浏览器配置页面 设置打开书签的时候在新标签页打开 然后搜索 browser.tabs.loadBookmarksInTabs 并将它的值改为tr ...

  8. C# 托盘图标缓存清除

    https://blog.csdn.net/weixin_42953003/article/details/119676004 using System; using System.Collectio ...

  9. 232转wifi

    232转wifi ZLAN7146是一款WIFI串口服务器.该串口服务器可以方便地使得串口设备连接到WIFI无线网络,实现串口设备的无线化网络升级.RS232接口支持全双工.不间断通信:RS485内嵌 ...

  10. s40破解证书

    说明因为怀旧,淘了个诺基亚5130xm.打开jar软件(比如QQ音乐,Anyview)后发现个问题,老是频繁弹出"是否同意读取用户数据"的弹窗而这些软件可能没有证书,没有证书的话意 ...