找回密码
 立即注册
首页 业界区 业界 Solon StateMachine 实现状态机使用示例详解

Solon StateMachine 实现状态机使用示例详解

葛雅隽 前天 11:06
什么是状态机

状态机是计算机科学中的核心建模工具,用于描述对象在其生命周期内状态变化的逻辑模型。它通过定义有限状态集合状态转移规则触发事件,精确控制系统的行为逻辑。
Solon StateMachine 是 Solon Framework  提供的一个功能强大的状态机框架,可实现复杂的工作流、订单管理等需要状态流转的场景。通过对状态、事件和转移的管理,开发者能够构建出简洁而灵活的状态机逻辑。
使用示例

1、导入maven依赖
  1. <dependency>
  2.     <groupId>org.noear</groupId>
  3.     solon-statemachine</artifactId>
  4.     <version>3.5.0</version>
  5. </dependency>
复制代码
2、创建订单状态枚举类
  1. import org.noear.solon.statemachine.State;
  2. public enum OrderStatus implements State{
  3.     WAITING_PAYMENT,//待支付
  4.     WAITING_RECEIVE,//待取货
  5.     FINISHED,//已完成
  6.     CANCELED;//已取消
  7. }
复制代码
3、创建订单转悠事件枚举类
  1. import org.noear.solon.statemachine.Event;
  2. public enum OrderEvent implements Event {
  3.     CREATE_ORDER,//创建订单
  4.     PAY_ORDER,//支付订单
  5.     RECEIVE_ORDER,//取货
  6.     CANCEL_ORDER,//取消订单
  7.     FINISH_ORDER//完成订单
  8. }
复制代码
4、创建订单实体,并实现 EventContext 接口(也可以不实现,改用 EventContext.of(...))
  1. public class Order implements EventContext<OrderStatus, Order> {
  2.     private final String orderId;
  3.     private OrderStatus status;
  4.     public Order(String orderId, OrderStatus status) {
  5.         this.orderId = orderId;
  6.         this.status = status;
  7.     }
  8.     public String getOrderId() {
  9.         return orderId;
  10.     }
  11.     public OrderStatus getStatus() {
  12.         return status;
  13.     }
  14.     public void setStatus(OrderStatus status) {
  15.         this.status = status;
  16.     }
  17.     // for EventContext
  18.     @Override
  19.     public OrderStatus getCurrentState() {
  20.         return status;
  21.     }
  22.     @Override
  23.     public Order getPayload() {
  24.         return this;
  25.     }
  26. }
复制代码
5、定义订单状态机组件,并添加状态转移规则。这里是重点了

Solon StateMachine 不管理当前状态,不涉及持久化。具有可复用、多线程安全特性。
  1. import org.noear.solon.annotation.Managed;
  2. import org.noear.solon.statemachine.StateMachine;
  3. @Managed
  4. public class OrderStateMachine extends StateMachine<OrderStatus, OrderEvent,Order> {
  5.     public OrderStateMachine() {
  6.         // 订单待支付 -> 待取货
  7.         addTransition(t -> t
  8.                 .from(OrderStatus.WAITING_PAYMENT)
  9.                 .to(OrderStatus.WAITING_RECEIVE)
  10.                 .on(OrderEvent.PAY_ORDER)
  11.                 .then(c -> c.getPayload().setStatus(c.getTo())));
  12.         // 订单待取货 -> 已完成
  13.         addTransition(t -> t
  14.                 .from(OrderStatus.WAITING_RECEIVE)
  15.                 .to(OrderStatus.FINISHED)
  16.                 .on(OrderEvent.FINISH_ORDER)
  17.                 .then(c -> c.getPayload().setStatus(c.getTo())));
  18.         // 订单待支付 -> 已取消
  19.         addTransition(t -> t
  20.                 .from(OrderStatus.WAITING_PAYMENT)
  21.                 .to(OrderStatus.CANCELED)
  22.                 .on(OrderEvent.CANCEL_ORDER)
  23.                 .then(c -> c.getPayload().setStatus(c.getTo())));
  24.     }
  25. }
复制代码
6、创建调用示例服务

Solon StateMachine 在发送事件时,通过 EventContext 传递当前状态和装载。
  1. @Managed
  2. public class OrderService {
  3.     @Inject
  4.     private OrderStateMachine orderStateMachine;
  5.     //支付
  6.     public Order pay() {
  7.         Order order = new Order("1", OrderStatus.WAITING_RECEIVE);
  8.         System.out.println("尝试支付,订单号:" + order.getOrderId());
  9.         try {
  10.             //事件: 支付, 状态转换:待支付 → 待发货
  11.             orderStateMachine.sendEvent(OrderEvent.PAY_ORDER, order);
  12.             System.out.println("支付成功,订单号:" + order.getOrderId());
  13.         } catch (Exception ex) {
  14.             System.out.println("支付失败, 状态异常,订单号:" + order.getOrderId());
  15.         }
  16.         return order;
  17.     }
  18. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册