订单状态枚举类与订单事件枚举类
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 {StateMachine<OrderStates, OrderEvents> state = orderStateMachine.create(OrderStates.CREATED);boolean success = state.sendEvent(event);if (success) {OrderStates newState = state.getState().getId();} 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);} catch (IllegalStateException e) {}}
}
总结
- 方式一(有状态状态机):适合处理复杂状态流转,功能强大,但实现较为复杂。
- 方式二(无状态状态机):简单易用,适合处理简单状态流转,且天然线程安全。