欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 如何使用状态机较好的实现订单状态流转?

如何使用状态机较好的实现订单状态流转?

2025/2/25 4:48:42 来源:https://blog.csdn.net/weixin_44512485/article/details/141672537  浏览:    关键词:如何使用状态机较好的实现订单状态流转?

订单状态枚举类与订单事件枚举类

public enum OrderStates {CREATED, PAID, SHIPPED, DELIVERED
}public enum OrderEvents {PAY, SHIP, DELIVER
}

方式一:使用Spring有状态状态机实现

OrderStateMachine
@Component
public class OrderStateMachine {private static StateMachine<OrderStates, OrderEvents> stateMachine() throws Exception {StateMachineBuilder.Builder<OrderStates, OrderEvents> builder = StateMachineBuilder.builder();builder.configureStates().withStates().initial(OrderStates.CREATED).states(EnumSet.allOf(OrderStates.class));builder.configureTransitions().withExternal().source(OrderStates.CREATED).target(OrderStates.PAID).event(OrderEvents.PAY).and().withExternal().source(OrderStates.PAID).target(OrderStates.SHIPPED).event(OrderEvents.SHIP).and().withExternal().source(OrderStates.SHIPPED).target(OrderStates.DELIVERED).event(OrderEvents.DELIVER);return builder.build();}public StateMachine<OrderStates, OrderEvents> create(OrderStates state) throws Exception {StateMachine<OrderStates, OrderEvents> stateMachine = stateMachine();stateMachine.stop();// 恢复状态机的状态StateMachineContext<OrderStates, OrderEvents> context = new DefaultStateMachineContext<>(state, null, null, null);stateMachine.getStateMachineAccessor().doWithAllRegions(access -> access.resetStateMachine(context));stateMachine.start();return stateMachine;}
}
OrderService
@Service
public class OrderService {@Autowiredprivate OrderStateMachine orderStateMachine;public void processOrderEvent(String orderId, OrderEvents event) throws Exception {// 使用Spring有状态状态机StateMachine<OrderStates, OrderEvents> state = orderStateMachine.create(OrderStates.CREATED);boolean success = state.sendEvent(event);if (success) {OrderStates newState = state.getState().getId();// 更新数据库或其他存储中的订单状态为newState} else {// 处理发送事件失败的情况}}
}

方式二:使用无状态状态机实现

StatelessOrderStateMachine
@Component
public class StatelessOrderStateMachine {public OrderStates handleEvent(OrderStates currentState, OrderEvents event) {switch (currentState) {case CREATED:if (event == OrderEvents.PAY) {return OrderStates.PAID;}break;case PAID:if (event == OrderEvents.SHIP) {return OrderStates.SHIPPED;}break;case SHIPPED:if (event == OrderEvents.DELIVER) {return OrderStates.DELIVERED;}break;default:throw new IllegalStateException("Unexpected state: " + currentState);}throw new IllegalArgumentException("Cannot handle event " + event + " in state " + currentState);}
}
OrderService
@Service
public class OrderService {@Autowiredprivate StatelessOrderStateMachine statelessOrderStateMachine;public void processOrderEvent(String orderId, OrderEvents event) {// 使用无状态状态机try {OrderStates newState = statelessOrderStateMachine.handleEvent(OrderStates.CREATED, event);// 更新数据库或其他存储中的订单状态为newState} catch (IllegalStateException e) {// 处理非法状态转换的情况}}
}

总结

  • 方式一(有状态状态机):适合处理复杂状态流转,功能强大,但实现较为复杂。
  • 方式二(无状态状态机):简单易用,适合处理简单状态流转,且天然线程安全。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词