# 状态流程 **Repository Path**: sunfengjiajia/machine ## Basic Information - **Project Name**: 状态流程 - **Description**: 处理状态跳转的轮子 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2021-11-08 - **Last Updated**: 2025-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # State Machine Framework ## 项目介绍 这是一个轻量级的状态机框架,专注于解决复杂业务场景下的状态流转问题。传统工作流引擎往往只适用于固定流程的状态迁移,而在实际业务中,我们经常遇到: - 状态流转路径动态可变 - 状态之间存在复杂的业务规则 - 需要频繁添加新状态和新的流转规则 - 多个对象并行处理时的状态一致性问题 本框架通过组件化的设计理念,将状态处理逻辑解耦,实现了高度的可扩展性和可维护性。 ## 核心特性 - **组件化状态处理**: 每个状态都是独立的Spring组件,职责单一,便于维护 - **声明式状态转换**: 使用注解优雅地定义状态流转规则 - **灵活的切面处理**: 支持状态转换前后的业务处理和校验 - **并行处理能力**: 内置线程池支持批量数据并行状态转换 - **参数传递机制**: 支持状态转换过程中的参数传递和数据共享 - **异常处理策略**: 提供可配置的异常处理和事务控制 - **Spring Boot友好**: 提供starter实现自动配置 ## 设计模式 项目中运用了多种设计模式来保证代码的可维护性和扩展性: 1. **状态模式**: 核心流转逻辑 2. **适配器模式**: 业务实体适配 3. **模板方法模式**: 处理器抽象 4. **观察者模式**: 状态变更通知 5. **策略模式**: 异常处理策略 ## 快速开始 ### 1. 添加依赖 \`\`\`xml com.medord.machine machine-spring-boot-starter 1.1-SNAPSHOT \`\`\` ### 2. 定义状态枚举 \`\`\`java public enum BusinessState implements IFlowState { STATE_NEW("0", "新建"), STATE_PROCESS("1", "处理中"), STATE_COMPLETE("2", "完成"); // ...实现接口方法 } \`\`\` ### 3. 创建状态适配器 \`\`\`java public class BusinessEntityAdapter implements ICurrentStateDto { private BusinessEntity entity; // ...实现接口方法 } \`\`\` ### 4. 实现状态处理器 \`\`\`java @StateService(clazz = BusinessState.class, status = "0") public class NewState extends FlowState { @TargetStateMethod(clazz = BusinessState.class, target = "1") @FlowAspectAnno(prefixCheckNames = {ValidationHandler.class}) public String toProcessing(ICurrentStateDto dto) { BusinessEntity entity = getEntity(dto); // 处理状态转换逻辑 return "处理成功"; } } \`\`\` ### 5. 使用状态机 \`\`\`java @Autowired private IFlowContext flowContext; public void changeState() { BusinessEntity entity = new BusinessEntity(); List dtoList = Collections.singletonList( new BusinessEntityAdapter(entity) ); FlowResult result = flowContext.forwordState( "business", // 流程名称 dtoList, // 待处理对象列表 "1", // 目标状态 null // 附加参数 ); } \`\`\` ## 最佳实践 ### 1. 状态定义规范 - 使用枚举类定义状态,实现 IFlowState 接口 - 状态码使用具有业务含义的编码 - 保持状态描述的准确性和一致性 ### 2. 处理器设计原则 - 单一职责:每个状态处理器只负责特定状态的转换逻辑 - 参数传递:使用 innerPara/outerPara 机制传递数据 - 异常处理:合理使用 needThrowException 控制事务 - 切面使用:将通用的校验和处理逻辑放在切面中 ### 3. 并发处理注意事项 - 识别并发冲突:评估状态间的依赖关系 - 状态一致性:确保批量处理时的数据一致性 - 性能优化:合理配置线程池参数 ### 4. 扩展建议 - 自定义处理器:继承 BaseFlowHandler 实现特定逻辑 - 状态组合:通过注解组合实现复杂的状态流转 - 监控集成:利用切面机制集成监控和日志 ## 注意事项 1. 状态处理器的线程安全性 2. 事务边界的正确划分 3. 异常处理的完整性 4. 状态流转的合法性校验 ## 贡献指南 1. Fork 本仓库 2. 新建 feature 分支 3. 提交代码 4. 新建 Pull Request ## License MIT License