Spring高级开发:状态机/事件/插件

B站影视 日本电影 2025-09-07 19:27 1

摘要:org.springframework.statemachinespring-statemachine-starter

我将为您演示一个完整的 Spring 状态机实现,包含状态机配置、事件机制和可扩展的插件体系。以下是一个订单处理系统的示例:

org.springframework.statemachinespring-statemachine-starter4.2.0 #技术分享org.springframeworkspring-context-support6.0.9public enum OrderState { NEW, PAYMENT_PENDING, PAID, SHIPPED, DELIVERED, CANCELLED}public enum OrderEvent { CREATE_ORDER, INITIATE_PAYMENT, PAYMENT_COMPLETED, SHIP_ORDER, DELIVERY_CONFIRMED, CANCEL_ORDER }public interface StateChangeListener { void onStateChange(OrderState from, OrderState to, String orderId);}public interface OrderOperationPlugin { void execute(String orderId, OrderState currentState); }public interface PluginManager { void registerStateChangeListener(StateChangeListener listener); void notifyStateChange(OrderState from, OrderState to, String orderId); void executePlugins(String orderId, OrderState currentState); }@Configuration@EnableStateMachinepublic class OrderStateMachineConfig extends EnumStateMachineConfigurerAdapter {@Autowired private List plugins;@Override public void configure(StateMachineStateConfigurer states) throws Exception { states .withStates .initial(OrderState.NEW) .state(OrderState.PAYMENT_PENDING) .junction(OrderState.PAID) .end(OrderState.DELIVERED) .end(OrderState.CANCELLED) .fork(OrderState.SHIPPED); }@Override public void configure(StateMachineTransitionConfigurer transitions) throws Exception { transitions .withExternal .source(OrderState.NEW).target(OrderState.PAYMENT_PENDING) .event(OrderEvent.CREATE_ORDER) .and.withExternal .source(OrderState.PAYMENT_PENDING).target(OrderState.PAID) .event(OrderEvent.INITIATE_PAYMENT) .and.withExternal .source(OrderState.PAID).target(OrderState.SHIPPED) .event(OrderEvent.SHIP_ORDER) .and.withExternal .source(OrderState.SHIPPED).target(OrderState.DELIVERED) .event(OrderEvent.DELIVERY_CONFIRMED) .and.withExternal .source(OrderState.NEW).target(OrderState.CANCELLED) .event(OrderEvent.CANCEL_ORDER) .and.withExternal .source(OrderState.PAYMENT_PENDING).target(OrderState.CANCELLED) .event(OrderEvent.CANCEL_ORDER); } @Bean public PluginManager pluginManager { return new DefaultPluginManager(plugins); } }@Componentpublic class DefaultPluginManager implements PluginManager { private final List stateChangeListeners = new ArrayList; private final List operationPlugins;public DefaultPluginManager(List plugins) { this.operationPlugins = plugins; }@Override public void registerStateChangeListener(StateChangeListener listener) { stateChangeListeners.add(listener); }@Override public void notifyStateChange(OrderState from, OrderState to, String orderId) { stateChangeListeners.forEach(listener -> listener.onStateChange(from, to, orderId)); }@Override public void executePlugins(String orderId, OrderState currentState) { operationPlugins.forEach(plugin -> plugin.execute(orderId, currentState)); } }@Componentpublic class LoggingPlugin implements OrderOperationPlugin { @Override public void execute(String orderId, OrderState currentState) { System.out.println("订单 " + orderId + " 当前状态: " + currentState + " - 正在记录日志"); }}@Component public class EmailNotificationPlugin implements OrderOperationPlugin { @Override public void execute(String orderId, OrderState currentState) { System.out.println("订单 " + orderId + " 当前状态: " + currentState + " - 发送邮件通知"); } }@Component public class InventoryUpdatePlugin implements OrderOperationPlugin { @Override public void execute(String orderId, OrderState currentState) { if (currentState == OrderState.PAID) { System.out.println("订单 " + orderId + " 已支付,正在更新库存"); } } }@Componentpublic class AuditStateChangeListener implements StateChangeListener { @Override public void onStateChange(OrderState from, OrderState to, String orderId) { System.out.println("订单状态变更: " + orderId + " 从 " + from + " 到 " + to + " - 审计记录已创建"); }}@Servicepublic class OrderService {@Autowired private StateMachine stateMachine;@Autowired private PluginManager pluginManager;public OrderService { pluginManager.registerStateChangeListener(new AuditStateChangeListener); }public void handleOrderEvent(String orderId, OrderEvent event) { try { stateMachine.start; OrderState currentState = stateMachine.getState.getId; stateMachine.sendEvent(event); OrderState newState = stateMachine.getState.getId; if (currentState != newState) { pluginManager.notifyStateChange(currentState, newState, orderId); } pluginManager.executePlugins(orderId, newState); } catch (Exception e) { System.err.println("处理订单事件失败: " + e.getMessage); } finally { stateMachine.stop; } } }@RestController@RequestMapping("/orders")public class OrderController {@Autowired private OrderService orderService;@PostMapping("/{orderId}/events") public ResponseEntity sendEvent(@PathVariable String orderId, @RequestParam String event) { try { OrderEvent orderEvent = OrderEvent.valueOf(event.toUpperCase); orderService.handleOrderEvent(orderId, orderEvent); return ResponseEntity.ok("事件已处理: " + event); } catch (IllegalArgumentException e) { return ResponseEntity.badRequest.body("无效的事件类型: " + event); } } @GetMapping("/{orderId}/status") public ResponseEntity checkStatus(@PathVariable String orderId) { return ResponseEntity.ok("订单 " + orderId + " 当前状态: 示例状态"); } }@Componentpublic class NewFeaturePlugin implements OrderOperationPlugin { @Override public void execute(String orderId, OrderState currentState) { }}@Componentpublic class NewStateChangeListener implements StateChangeListener { @Override public void onStateChange(OrderState from, OrderState to, String orderId) { }}# 创建订单POST /orders/123/events?event=CREATE_ORDER# 发起支付POST /orders/123/events?event=INITIATE_PAYMENT# 发货POST /orders/123/events?event=SHIP_ORDER# 确认送达POST /orders/123/events?event=DELIVERY_CONFIRMED# 取消订单POST /orders/123/events?event=CANCEL_ORDER

来源:墨码行者

相关推荐