# 状态流程
**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