SpringBoot里,什么是状态机?在商城系统的订单管理业务上如何应用?
什么是状态机?
状态机(State Machine)是一种数学模型,用于描述系统在不同状态间的转换。它由以下部分组成:
- 状态(State):系统可能处于的各个状态。
- 事件(Event):触发状态转换的动作或条件。
- 转换(Transition):事件触发后,系统从一个状态转移到另一个状态的过程。
- 动作(Action):状态转换时执行的操作。
状态机分为有限状态机(FSM)和无限状态机,Spring Boot 中常用的是有限状态机。
状态机在订单管理中的应用
在商城系统中,订单状态通常包括:待支付
、已支付
、已发货
、已收货
、已完成
、已取消
等。状态机可以清晰地管理这些状态及其转换。
1. 定义订单状态和事件
-
状态:
待支付(PENDING_PAYMENT)
已支付(PAID)
已发货(SHIPPED)
已收货(RECEIVED)
已完成(COMPLETED)
已取消(CANCELLED)
-
事件:
支付(PAY)
发货(SHIP)
确认收货(RECEIVE)
完成订单(COMPLETE)
取消订单(CANCEL)
2. 状态转换规则
待支付
→已支付
(支付事件)已支付
→已发货
(发货事件)已发货
→已收货
(确认收货事件)已收货
→已完成
(完成订单事件)待支付
→已取消
(取消订单事件)已支付
→已取消
(取消订单事件)
3. 实现状态机
在 Spring Boot 中,可以使用 Spring State Machine 来实现状态机。
3.1 添加依赖
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-core</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
3.2 定义状态和事件
public enum OrderStates {
PENDING_PAYMENT, PAID, SHIPPED, RECEIVED, COMPLETED, CANCELLED
}
public enum OrderEvents {
PAY, SHIP, RECEIVE, COMPLETE, CANCEL
}
3.3 配置状态机
@Configuration
@EnableStateMachine
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<OrderStates, OrderEvents> {
@Override
public void configure(StateMachineStateConfigurer<OrderStates, OrderEvents> states) throws Exception {
states
.withStates()
.initial(OrderStates.PENDING_PAYMENT)
.states(EnumSet.allOf(OrderStates.class));
}
@Override
public void configure(StateMachineTransitionConfigurer<OrderStates, OrderEvents> transitions) throws Exception {
transitions
.withExternal()
.source(OrderStates.PENDING_PAYMENT).target(OrderStates.PAID).event(OrderEvents.PAY)
.and()
.withExternal()
.source(OrderStates.PAID).target(OrderStates.SHIPPED).event(OrderEvents.SHIP)
.and()
.withExternal()
.source(OrderStates.SHIPPED).target(OrderStates.RECEIVED).event(OrderEvents.RECEIVE)
.and()
.withExternal()
.source(OrderStates.RECEIVED).target(OrderStates.COMPLETED).event(OrderEvents.COMPLETE)
.and()
.withExternal()
.source(OrderStates.PENDING_PAYMENT).target(OrderStates.CANCELLED).event(OrderEvents.CANCEL)
.and()
.withExternal()
.source(OrderStates.PAID).target(OrderStates.CANCELLED).event(OrderEvents.CANCEL);
}
}
3.4 使用状态机
@Service
public class OrderService {
@Autowired
private StateMachine<OrderStates, OrderEvents> stateMachine;
public void payOrder() {
stateMachine.sendEvent(OrderEvents.PAY);
}
public void shipOrder() {
stateMachine.sendEvent(OrderEvents.SHIP);
}
public void receiveOrder() {
stateMachine.sendEvent(OrderEvents.RECEIVE);
}
public void completeOrder() {
stateMachine.sendEvent(OrderEvents.COMPLETE);
}
public void cancelOrder() {
stateMachine.sendEvent(OrderEvents.CANCEL);
}
}
总结
状态机在订单管理中能有效管理状态转换,确保订单状态按预期流转。通过 Spring State Machine,可以简化状态机的实现,提升代码的可维护性和可读性。