开封市建设银行网站徐州梦网科技做网站怎么样

张小明 2025/12/31 11:27:50
开封市建设银行网站,徐州梦网科技做网站怎么样,2018年怎样做淘宝客网站,保定门户网站Spring State Machine是Spring生态系统中一个强大的状态机框架#xff0c;它让复杂的状态流转变得优雅而简单。本文将带你从基础概念出发#xff0c;逐步深入理解并掌握Spring状态机在实际生产环境中的应用。一、状态机是什么#xff1f;为什么要用它#xff1f;想象一下订…Spring State Machine是Spring生态系统中一个强大的状态机框架它让复杂的状态流转变得优雅而简单。本文将带你从基础概念出发逐步深入理解并掌握Spring状态机在实际生产环境中的应用。一、状态机是什么为什么要用它想象一下订单系统用户下单后订单会经历待支付→已支付→待发货→已发货→已完成等一系列状态变化。如果在代码里用if-else来处理这些状态流转很快就会变成一团乱麻。状态机State Machine就是解决这类问题的利器它明确定义了状态State系统可能处于的状态事件Event触发状态变化的动作转换Transition状态之间的流转规则二、Spring状态机核心概念2.1 三大核心组件java // 1. 定义状态枚举 public enum OrderStatus { WAIT_PAYMENT, // 待支付 PAID, // 已支付 WAIT_DELIVER, // 待发货 DELIVERED, // 已发货 COMPLETED, // 已完成 CANCELLED // 已取消 } // 2. 定义事件枚举 public enum OrderEvent { PAY, // 支付 DELIVER, // 发货 RECEIVE, // 收货 CANCEL // 取消 } // 3. 配置状态机 Configuration EnableStateMachine public class OrderStateMachineConfig extends StateMachineConfigurerAdapterOrderStatus, OrderEvent { Override public void configure(StateMachineStateConfigurerOrderStatus, OrderEvent states) throws Exception { states.withStates() .initial(OrderStatus.WAIT_PAYMENT) .states(EnumSet.allOf(OrderStatus.class)); } Override public void configure(StateMachineTransitionConfigurerOrderStatus, OrderEvent transitions) throws Exception { transitions .withExternal() .source(OrderStatus.WAIT_PAYMENT) .target(OrderStatus.PAID) .event(OrderEvent.PAY) .and() .withExternal() .source(OrderStatus.PAID) .target(OrderStatus.WAIT_DELIVER) .event(OrderEvent.DELIVER) .and() .withExternal() .source(OrderStatus.WAIT_DELIVER) .target(OrderStatus.DELIVERED) .event(OrderEvent.RECEIVE) .and() .withExternal() .source(OrderStatus.DELIVERED) .target(OrderStatus.COMPLETED) .event(OrderEvent.RECEIVE); } }2.2 状态持久化生产环境中状态必须持久化。Spring状态机支持多种持久化方式java Service RequiredArgsConstructor public class OrderService { private final StateMachineFactoryOrderStatus, OrderEvent factory; private final StateMachinePersistOrderStatus, OrderEvent, String persist; public boolean pay(String orderId) { StateMachineOrderStatus, OrderEvent sm restoreStateMachine(orderId); boolean result sm.sendEvent(OrderEvent.PAY); if (result) { persistStateMachine(orderId, sm); // 发送支付成功消息 publishPaymentSuccessEvent(orderId); } return result; } private StateMachineOrderStatus, OrderEvent restoreStateMachine(String orderId) { try { return persist.restore(factory.getStateMachine(), orderId); } catch (Exception e) { throw new RuntimeException(恢复状态机失败, e); } } private void persistStateMachine(String orderId, StateMachineOrderStatus, OrderEvent sm) { try { persist.persist(sm, orderId); } catch (Exception e) { throw new RuntimeException(保存状态机失败, e); } } }三、生产实战工作流引擎让我们看一个更复杂的例子——审批工作流系统java // 支持并行审批的复杂状态机 Configuration EnableStateMachine(name workflowStateMachine) public class WorkflowStateMachineConfig extends EnumStateMachineConfigurerAdapterWorkflowState, WorkflowEvent { Override public void configure(StateMachineStateConfigurerWorkflowState, WorkflowEvent states) throws Exception { states .withStates() .initial(WorkflowState.DRAFT) .fork(WorkflowState.FORK) .join(WorkflowState.JOIN) .state(WorkflowState.FINISHED) .and() .withStates() .parent(WorkflowState.FORK) .initial(WorkflowState.DEPT_APPROVAL) .state(WorkflowState.DEPT_APPROVED) .and() .withStates() .parent(WorkflowState.FORK) .initial(WorkflowState.FINANCE_APPROVAL) .state(WorkflowState.FINANCE_APPROVED); } Override public void configure(StateMachineTransitionConfigurerWorkflowState, WorkflowEvent transitions) throws Exception { transitions // 提交到并行审批 .withExternal() .source(WorkflowState.DRAFT) .target(WorkflowState.FORK) .event(WorkflowEvent.SUBMIT) // 部门审批分支 .and() .withExternal() .source(WorkflowState.DEPT_APPROVAL) .target(WorkflowState.DEPT_APPROVED) .event(WorkflowEvent.DEPT_APPROVE) // 财务审批分支 .and() .withExternal() .source(WorkflowState.FINANCE_APPROVAL) .target(WorkflowState.FINANCE_APPROVED) .event(WorkflowEvent.FINANCE_APPROVE) // 合并后完成 .and() .withExternal() .source(WorkflowState.JOIN) .target(WorkflowState.FINISHED) .event(WorkflowEvent.COMPLETE); } }四、状态监听器记录每一次变化javanComponent WithStateMachine public class OrderStateListener { private static final Logger log LoggerFactory.getLogger(OrderStateListener.class); OnTransition(target PAID) public void onPay(MessageOrderEvent message) { String orderId getHeader(message, orderId); log.info(订单{}支付成功状态流转到已支付, orderId); // 触发后续业务逻辑 paymentSuccessHandler.handle(orderId); } OnTransition(target DELIVERED) public void onDeliver(MessageOrderEvent message) { String orderId getHeader(message, orderId); log.info(订单{}已发货状态流转到已发货, orderId); // 发送短信通知 smsService.sendDeliverySms(orderId); } OnTransitionEnd public void onTransitionEnd(StateContextOrderStatus, OrderEvent context) { log.info(状态转换完成{} - {}, 事件{}, context.getSource().getId(), context.getTarget().getId(), context.getEvent() ); // 持久化状态转换记录 transitionLogService.log(context); } private String getHeader(MessageOrderEvent message, String headerName) { return message.getHeaders().get(headerName, String.class); } }五、Guards智能的状态转换守卫java Component public class OrderGuard { Bean public GuardOrderStatus, OrderEvent payGuard() { return context - { String orderId context.getMessageHeader(orderId); BigDecimal amount orderService.getOrderAmount(orderId); // 检查订单金额 if (amount.compareTo(BigDecimal.ZERO) 0) { log.warn(订单{}支付失败金额为0, orderId); return false; } // 检查库存 boolean hasStock inventoryService.checkStock(orderId); if (!hasStock) { log.warn(订单{}支付失败库存不足, orderId); return false; } return true; }; } } // 在状态机配置中使用guard Override public void configure(StateMachineTransitionConfigurerOrderStatus, OrderEvent transitions) throws Exception { transitions .withExternal() .source(OrderStatus.WAIT_PAYMENT) .target(OrderStatus.PAID) .event(OrderEvent.PAY) .guard(payGuard()); // 添加守卫条件 }六、实战技巧与最佳实践6.1 状态机可视化javanRestController RequestMapping(/state-machine) public class StateMachineVisualController { GetMapping(/diagram/{orderId}) public ResponseEntityString getStateDiagram(PathVariable String orderId) { // 获取当前状态 OrderStatus currentStatus orderService.getOrderStatus(orderId); // 生成PlantUML格式的状态图 String diagram generatePlantUMLDiagram(currentStatus); return ResponseEntity.ok() .contentType(MediaType.TEXT_PLAIN) .body(diagram); } private String generatePlantUMLDiagram(OrderStatus currentStatus) { StringBuilder sb new StringBuilder(); sb.append(startuml\n); sb.append([*] -- WAIT_PAYMENT\n); sb.append(WAIT_PAYMENT -- PAID : PAY\n); sb.append(PAID -- WAIT_DELIVER : DELIVER\n); sb.append(WAIT_DELIVER -- DELIVERED : RECEIVE\n); sb.append(DELIVERED -- COMPLETED : RECEIVE\n); // 高亮当前状态 sb.append(skinparam state {\n); sb.append( BackgroundColorCurrent LightBlue\n); sb.append(}\n); sb.append(state ).append(currentStatus).append( Current\n); sb.append(enduml\n); return sb.toString(); } }6.2 分布式状态一致性java // 使用分布式锁确保状态转换的原子性 Service public class DistributedOrderService { private final RedissonClient redisson; private final StateMachineFactoryOrderStatus, OrderEvent factory; public boolean transition(String orderId, OrderEvent event) { RLock lock redisson.getLock(order:state: orderId); try { // 最多等待3秒持锁10秒 if (lock.tryLock(3, 10, TimeUnit.SECONDS)) { // 恢复状态机 StateMachineOrderStatus, OrderEvent sm restoreStateMachine(orderId); // 发送事件并处理结果 boolean result sm.sendEvent(event); if (result) { // 持久化新状态 persistStateMachine(orderId, sm); // 发布领域事件 publishDomainEvent(orderId, event, sm.getState().getId()); } return result; } } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException(状态转换被中断, e); } finally { if (lock.isHeldByCurrentThread()) { lock.unlock(); } } return false; } }七、性能优化建议状态机缓存频繁使用的状态机实例可以缓存避免重复创建异步事件处理使用Spring的事件驱动模型异步处理状态变化批量持久化多个状态变化可以合并为一次数据库操作读写分离状态查询走从库状态更新走主库八、总结Spring状态机的优势在于代码清晰将复杂的状态流转从业务代码中分离易于维护状态转换规则集中管理可测试性强可以单独测试状态机逻辑生产就绪支持持久化、监听、分布式等高级特性当你的业务涉及复杂的状态流转时Spring状态机绝对是你的得力助手。它让状态管理变得优雅让代码更容易理解和维护。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做球衣外贸用什么网站六安建设部网站

SSCom串口调试工具完整使用教程:Linux和macOS平台终极指南 【免费下载链接】sscom Linux/Mac版本 串口调试助手 项目地址: https://gitcode.com/gh_mirrors/ss/sscom SSCom是一款专为Linux和macOS系统设计的开源串口调试助手,为嵌入式开发者和硬件…

张小明 2025/12/30 8:01:39 网站建设

小企业公司网站建设电商系统什么品牌好

Soluling是一款功能强大的专业本地化工具,专注于软件、文档及数据的多语言适配工作。该工具通过自动化流程大幅提升本地化效率,支持100多种文件格式,为开发团队和翻译专业人员提供了完整的本地化解决方案。 获取地址:https://pan…

张小明 2025/12/30 8:01:04 网站建设

做网站过程小红书信息流广告投放

在Vue项目中,HTTP请求超时时间参数配置主要通过Axios(主流HTTP客户端库)实现,支持全局配置、实例配置和单个请求配置三种方式,覆盖不同场景的需求。以下是详细的配置教程及注意事项: 一、前置条件&#xf…

张小明 2025/12/30 7:59:54 网站建设

重庆网站建设-首选云慧通代码命名 网站

Keil4安装全攻略:从零开始搭建嵌入式开发环境 你是不是也遇到过这种情况?刚准备入门STM32,打开电脑想装个Keil,结果一搜“keil4下载”跳出来几十个链接,点进去不是病毒弹窗就是失效页面。好不容易下完安装却卡在第一步…

张小明 2025/12/30 7:59:18 网站建设

合肥建设发展局网站最全的提交网站入口大全

Docker镜像生命周期管理:定期清理无用PyTorch镜像 在AI实验室或生产服务器上跑深度学习任务的工程师,可能都经历过这样的场景:某天系统突然告警磁盘使用率超过95%,登录一看,/var/lib/docker 目录竟占了120GB。排查发现…

张小明 2025/12/30 7:58:43 网站建设

链接网站某一页面如何做下载中心免费下载

Kotaemon滚动更新配置:平稳替换旧版本实例 在企业级 AI 应用日益复杂的今天,一个智能客服系统可能每天要处理数万次用户咨询,任何一次部署中断都可能导致客户流失、声誉受损。想象一下,某银行的虚拟助手正在为用户解答贷款政策&am…

张小明 2025/12/30 7:58:06 网站建设