可正常启动
This commit is contained in:
parent
33448f5ac5
commit
609a662945
@ -1,548 +1,494 @@
|
||||
# 工作流引擎功能开发文档
|
||||
# 工作流引擎开发文档
|
||||
|
||||
## 已实现功能
|
||||
## 一、已完成工作
|
||||
|
||||
### 1. 核心功能
|
||||
- [x] 工作流定义管理
|
||||
- 工作流定义的CRUD操作
|
||||
- 工作流状态管理(草稿、发布、禁用)
|
||||
- 工作流版本控制
|
||||
### 1. 核心实体设计
|
||||
- WorkflowDefinition: 工作流定义
|
||||
- 包含基本信息(编码、名称、描述等)
|
||||
- 包含流程定义内容(JSON格式)
|
||||
- 支持版本控制和状态管理
|
||||
|
||||
- [x] 工作流实例管理
|
||||
- 工作流实例的创建和执行
|
||||
- 实例状态管理(运行、暂停、完成、失败、取消)
|
||||
- 实例执行历史记录
|
||||
- WorkflowInstance: 工作流实例
|
||||
- 关联工作流定义
|
||||
- 记录执行状态和进度
|
||||
- 支持暂停、恢复、取消等操作
|
||||
|
||||
- [x] 节点实例管理
|
||||
- 节点实例的创建和执行
|
||||
- 节点状态管理(等待、运行、完成、失败、取消)
|
||||
- 节点执行历史记录
|
||||
- NodeInstance: 节点实例
|
||||
- 关联工作流实例
|
||||
- 记录节点执行状态和结果
|
||||
- 支持重试和跳过等操作
|
||||
|
||||
### 2. 节点类型
|
||||
- [x] Shell节点
|
||||
- 支持Windows/Unix跨平台
|
||||
- 工作目录配置
|
||||
- 环境变量支持
|
||||
- 超时处理
|
||||
- 输出流日志记录
|
||||
### 2. 节点类型体系
|
||||
- 基础节点类型:
|
||||
- START: 开始节点
|
||||
- END: 结束节点
|
||||
- CONDITION: 条件节点
|
||||
- PARALLEL: 并行节点
|
||||
|
||||
### 3. 日志管理
|
||||
- [x] 日志记录
|
||||
- 工作流级别日志
|
||||
- 节点级别日志
|
||||
- 系统级别日志
|
||||
- 变量更新日志
|
||||
- 功能节点类型:
|
||||
- APPROVAL: 审批节点
|
||||
- JENKINS: Jenkins构建节点
|
||||
- SCRIPT: 脚本执行节点
|
||||
- GIT: Git操作节点
|
||||
- NACOS: 配置中心节点
|
||||
- HTTP: HTTP请求节点
|
||||
- NOTIFY: 通知节点
|
||||
|
||||
- [x] 日志查询
|
||||
- 工作流日志查询
|
||||
- 节点日志查询
|
||||
- 支持分页和条件过滤
|
||||
### 3. 工作流引擎实现
|
||||
- 核心接口设计
|
||||
- WorkflowEngine: 工作流引擎接口
|
||||
- NodeExecutor: 节点执行器接口
|
||||
|
||||
## 待实现功能
|
||||
- 默认实现
|
||||
- DefaultWorkflowEngine: 默认工作流引擎实现
|
||||
- AbstractNodeExecutor: 抽象节点执行器
|
||||
- ShellNodeExecutor等具体执行器
|
||||
|
||||
### 1. 节点类型扩展
|
||||
#### 1.1 Jenkins节点
|
||||
### 4. 变量与日志管理
|
||||
- WorkflowVariable: 工作流变量
|
||||
- 支持全局变量和节点变量
|
||||
- 支持变量引用和替换
|
||||
|
||||
- WorkflowLog: 工作流日志
|
||||
- 支持不同日志类型和级别
|
||||
- 支持详细的执行记录
|
||||
|
||||
### 5. 权限管理
|
||||
- WorkflowPermission: 工作流权限
|
||||
- 支持角色和用户级别的权限控制
|
||||
- 支持操作级别的权限控制
|
||||
|
||||
### 6. API接口设计
|
||||
- 工作流定义管理
|
||||
- 工作流实例操作
|
||||
- 节点实例管理
|
||||
- 日志查询等功能
|
||||
|
||||
### 7. 错误码和消息
|
||||
- 工作流相关错误码(2700-2799)
|
||||
- 详细的错误消息定义
|
||||
|
||||
## 二、待完成工作
|
||||
|
||||
### 1. 高级功能实现
|
||||
|
||||
#### 1.1 节点执行引擎增强
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 添加Jenkins客户端依赖
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.offbytwo.jenkins</groupId>
|
||||
<artifactId>jenkins-client</artifactId>
|
||||
<version>0.3.8</version>
|
||||
</dependency>
|
||||
```
|
||||
public interface NodeExecutor {
|
||||
// 新增预执行检查
|
||||
boolean preCheck(NodeInstance node, WorkflowContext context);
|
||||
|
||||
2. 实现Jenkins节点执行器
|
||||
```java
|
||||
@Component
|
||||
public class JenkinsNodeExecutor extends AbstractNodeExecutor {
|
||||
@Override
|
||||
protected boolean doExecute(NodeInstance nodeInstance, WorkflowContext context, NodeConfig config) {
|
||||
JenkinsNodeConfig jenkinsConfig = (JenkinsNodeConfig) config;
|
||||
// 1. 连接Jenkins服务器
|
||||
// 2. 触发构建任务
|
||||
// 3. 等待构建完成
|
||||
// 4. 获取构建结果
|
||||
// 5. 处理构建产物
|
||||
// 新增补偿操作
|
||||
void compensate(NodeInstance node, WorkflowContext context);
|
||||
|
||||
// 新增超时处理
|
||||
void handleTimeout(NodeInstance node, WorkflowContext context);
|
||||
}
|
||||
|
||||
// 节点执行状态追踪
|
||||
public class NodeExecutionTracker {
|
||||
private Long nodeInstanceId;
|
||||
private Date startTime;
|
||||
private Date endTime;
|
||||
private String status;
|
||||
private Map<String, Object> metrics;
|
||||
private List<String> logs;
|
||||
}
|
||||
```
|
||||
|
||||
3. 添加构建结果处理
|
||||
- 支持构建状态判断
|
||||
- 支持测试结果解析
|
||||
- 支持构建产物下载
|
||||
```
|
||||
|
||||
#### 1.2 Git节点
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 添加JGit依赖
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jgit</groupId>
|
||||
<artifactId>org.eclipse.jgit</artifactId>
|
||||
<version>6.5.0.202303070854-r</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
2. 实现Git节点执行器
|
||||
```java
|
||||
@Component
|
||||
public class GitNodeExecutor extends AbstractNodeExecutor {
|
||||
@Override
|
||||
protected boolean doExecute(NodeInstance nodeInstance, WorkflowContext context, NodeConfig config) {
|
||||
GitNodeConfig gitConfig = (GitNodeConfig) config;
|
||||
// 1. 克隆/拉取代码
|
||||
// 2. 切换分支/标签
|
||||
// 3. 执行Git操作
|
||||
// 4. 提交更改
|
||||
// 5. 推送远程
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. 添加Git操作支持
|
||||
- 分支管理
|
||||
- 标签管理
|
||||
- 代码合并
|
||||
- 冲突处理
|
||||
```
|
||||
|
||||
### 2. 日志管理增强
|
||||
|
||||
#### 2.1 日志导出功能
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 添加Excel导出依赖
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-ooxml</artifactId>
|
||||
<version>5.2.3</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
2. 实现日志导出服务
|
||||
```java
|
||||
@Service
|
||||
public class WorkflowLogExportService {
|
||||
public void exportToExcel(Long workflowInstanceId, OutputStream output) {
|
||||
// 1. 查询日志数据
|
||||
// 2. 创建Excel工作簿
|
||||
// 3. 写入日志数据
|
||||
// 4. 格式化和样式设置
|
||||
// 5. 输出文件
|
||||
}
|
||||
|
||||
public void exportToCsv(Long workflowInstanceId, Writer writer) {
|
||||
// 1. 查询日志数据
|
||||
// 2. 写入CSV头
|
||||
// 3. 写入日志数据
|
||||
// 4. 刷新输出
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. 添加导出接口
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/workflow")
|
||||
public class WorkflowLogController {
|
||||
@GetMapping("/{instanceId}/logs/export")
|
||||
public void exportLogs(@PathVariable Long instanceId,
|
||||
@RequestParam String format,
|
||||
HttpServletResponse response) {
|
||||
// 1. 设置响应头
|
||||
// 2. 获取输出流
|
||||
// 3. 调用导出服务
|
||||
// 4. 处理异常
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2 日志清理功能
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 添加定时任务配置
|
||||
```java
|
||||
@Configuration
|
||||
@EnableScheduling
|
||||
public class WorkflowLogCleanupConfig {
|
||||
@Scheduled(cron = "${workflow.log.cleanup.cron}")
|
||||
public void cleanupLogs() {
|
||||
// 1. 获取清理策略
|
||||
// 2. 查询过期日志
|
||||
// 3. 批量删除日志
|
||||
// 4. 记录清理结果
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
2. 实现日志清理服务
|
||||
```java
|
||||
@Service
|
||||
public class WorkflowLogCleanupService {
|
||||
public void cleanupByTime(LocalDateTime before) {
|
||||
// 1. 分批查询日志
|
||||
// 2. 物理删除日志
|
||||
// 3. 记录清理统计
|
||||
}
|
||||
|
||||
public void cleanupByInstance(Long workflowInstanceId) {
|
||||
// 1. 查询实例日志
|
||||
// 2. 物理删除日志
|
||||
// 3. 记录清理结果
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 工作流监控
|
||||
|
||||
#### 3.1 执行监控
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 添加监控指标收集
|
||||
```java
|
||||
@Component
|
||||
public class WorkflowMetricsCollector {
|
||||
private final MeterRegistry registry;
|
||||
|
||||
public void recordExecutionTime(String workflowName, long timeMs) {
|
||||
// 记录执行时长
|
||||
}
|
||||
|
||||
public void recordNodeExecutionTime(String nodeName, long timeMs) {
|
||||
// 记录节点执行时长
|
||||
}
|
||||
|
||||
public void incrementExecutionCounter(String workflowName, String status) {
|
||||
// 增加执行计数
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
2. 实现监控数据存储
|
||||
```java
|
||||
@Entity
|
||||
@Table(name = "wf_workflow_metrics")
|
||||
public class WorkflowMetrics {
|
||||
// 执行时长
|
||||
private Long executionTime;
|
||||
// 成功率
|
||||
private Double successRate;
|
||||
// 失败次数
|
||||
private Integer failureCount;
|
||||
// 平均节点执行时长
|
||||
private Long avgNodeExecutionTime;
|
||||
}
|
||||
```
|
||||
|
||||
3. 添加监控接口
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/workflow/metrics")
|
||||
public class WorkflowMetricsController {
|
||||
@GetMapping("/overview")
|
||||
public WorkflowMetricsOverview getOverview() {
|
||||
// 返回整体监控数据
|
||||
}
|
||||
|
||||
@GetMapping("/{workflowId}")
|
||||
public WorkflowMetricsDetail getDetail(@PathVariable Long workflowId) {
|
||||
// 返回具体工作流监控数据
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2 告警通知
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 定义告警规则
|
||||
```java
|
||||
@Entity
|
||||
@Table(name = "wf_alert_rule")
|
||||
public class AlertRule {
|
||||
// 告警类型
|
||||
private AlertType type;
|
||||
// 告警阈值
|
||||
private String threshold;
|
||||
// 告警级别
|
||||
private AlertLevel level;
|
||||
// 通知方式
|
||||
private List<NotifyChannel> channels;
|
||||
}
|
||||
```
|
||||
|
||||
2. 实现告警服务
|
||||
```java
|
||||
@Service
|
||||
public class WorkflowAlertService {
|
||||
public void checkAndAlert(WorkflowInstance instance) {
|
||||
// 1. 获取告警规则
|
||||
// 2. 检查是否触发
|
||||
// 3. 生成告警信息
|
||||
// 4. 发送通知
|
||||
}
|
||||
|
||||
public void sendAlert(Alert alert) {
|
||||
// 1. 获取通知渠道
|
||||
// 2. 发送通知
|
||||
// 3. 记录通知结果
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 工作流调度
|
||||
|
||||
#### 4.1 定时调度
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 添加调度配置
|
||||
```java
|
||||
@Entity
|
||||
@Table(name = "wf_workflow_schedule")
|
||||
public class WorkflowSchedule {
|
||||
// 调度类型
|
||||
private ScheduleType type;
|
||||
// Cron表达式
|
||||
private String cronExpression;
|
||||
// 生效时间
|
||||
private LocalDateTime effectiveTime;
|
||||
// 失效时间
|
||||
private LocalDateTime expireTime;
|
||||
}
|
||||
```
|
||||
|
||||
2. 实现调度服务
|
||||
#### 1.2 工作流调度管理
|
||||
```java
|
||||
@Service
|
||||
public class WorkflowScheduleService {
|
||||
public void schedule(WorkflowSchedule schedule) {
|
||||
// 1. 验证调度配置
|
||||
// 2. 创建调度任务
|
||||
// 3. 注册到调度器
|
||||
// 4. 记录调度状态
|
||||
// 创建调度任务
|
||||
public void createSchedule(WorkflowSchedule schedule);
|
||||
|
||||
// 修改调度配置
|
||||
public void updateSchedule(WorkflowSchedule schedule);
|
||||
|
||||
// 启用/禁用调度
|
||||
public void toggleSchedule(Long scheduleId, boolean enabled);
|
||||
|
||||
// 手动触发
|
||||
public void triggerSchedule(Long scheduleId);
|
||||
}
|
||||
|
||||
public void executeScheduledWorkflow(Long scheduleId) {
|
||||
// 1. 获取调度配置
|
||||
// 2. 创建工作流实例
|
||||
// 3. 执行工作流
|
||||
// 4. 记录执行结果
|
||||
// 调度配置表
|
||||
CREATE TABLE wf_workflow_schedule (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
workflow_definition_id BIGINT NOT NULL COMMENT '工作流定义ID',
|
||||
name VARCHAR(100) NOT NULL COMMENT '调度名称',
|
||||
cron VARCHAR(100) NOT NULL COMMENT 'cron表达式',
|
||||
variables JSON COMMENT '工作流变量',
|
||||
enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用',
|
||||
last_fire_time DATETIME COMMENT '上次触发时间',
|
||||
next_fire_time DATETIME COMMENT '下次触发时间',
|
||||
-- 其他基础字段
|
||||
);
|
||||
```
|
||||
|
||||
#### 1.3 工作流监控告警
|
||||
```java
|
||||
public interface WorkflowMonitor {
|
||||
// 收集性能指标
|
||||
void collectMetrics(WorkflowInstance instance);
|
||||
|
||||
// 检查健康状态
|
||||
HealthStatus checkHealth();
|
||||
|
||||
// 触发告警
|
||||
void triggerAlert(AlertType type, String message);
|
||||
}
|
||||
|
||||
// 监控指标表
|
||||
CREATE TABLE wf_workflow_metrics (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
workflow_instance_id BIGINT NOT NULL,
|
||||
metric_name VARCHAR(100) NOT NULL,
|
||||
metric_value DECIMAL(19,2) NOT NULL,
|
||||
collect_time DATETIME NOT NULL,
|
||||
-- 其他基础字段
|
||||
);
|
||||
|
||||
// 告警记录表
|
||||
CREATE TABLE wf_workflow_alert (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
alert_type VARCHAR(50) NOT NULL,
|
||||
target_type VARCHAR(50) NOT NULL,
|
||||
target_id BIGINT NOT NULL,
|
||||
level VARCHAR(20) NOT NULL,
|
||||
message TEXT NOT NULL,
|
||||
status VARCHAR(20) NOT NULL,
|
||||
-- 其他基础字段
|
||||
);
|
||||
```
|
||||
|
||||
#### 1.4 工作流分析统计
|
||||
```java
|
||||
public interface WorkflowAnalytics {
|
||||
// 执行时长分析
|
||||
Map<String, Duration> analyzeExecutionTime(Long workflowId);
|
||||
|
||||
// 成功率分析
|
||||
Map<String, Double> analyzeSuccessRate(Long workflowId);
|
||||
|
||||
// 节点耗时分析
|
||||
List<NodeTimeAnalysis> analyzeNodeTime(Long workflowId);
|
||||
}
|
||||
|
||||
// 分析结果表
|
||||
CREATE TABLE wf_workflow_analytics (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
workflow_definition_id BIGINT NOT NULL,
|
||||
analysis_type VARCHAR(50) NOT NULL,
|
||||
time_range VARCHAR(50) NOT NULL,
|
||||
metrics JSON NOT NULL,
|
||||
-- 其他基础字段
|
||||
);
|
||||
```
|
||||
|
||||
### 2. 功能优化计划
|
||||
|
||||
#### 2.1 性能优化
|
||||
- 引入本地缓存和分布式缓存
|
||||
- 实现工作流实例分片执行
|
||||
- 优化日志存储和查询
|
||||
```java
|
||||
@Configuration
|
||||
public class WorkflowCacheConfig {
|
||||
@Bean
|
||||
public Cache<String, WorkflowDefinition> definitionCache() {
|
||||
return CacheBuilder.newBuilder()
|
||||
.maximumSize(1000)
|
||||
.expireAfterWrite(1, TimeUnit.HOURS)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
public class ShardingWorkflowEngine implements WorkflowEngine {
|
||||
// 分片执行实现
|
||||
public void executeWithSharding(WorkflowInstance instance) {
|
||||
String shardingKey = calculateShardingKey(instance);
|
||||
ShardingContext context = createShardingContext(shardingKey);
|
||||
executeInShard(instance, context);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 4.2 依赖调度
|
||||
#### 2.2 可靠性增强
|
||||
- 实现节点执行幂等性
|
||||
- 增加全局事务控制
|
||||
- 完善补偿机制
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 添加依赖配置
|
||||
```java
|
||||
@Entity
|
||||
@Table(name = "wf_workflow_dependency")
|
||||
public class WorkflowDependency {
|
||||
// 上游工作流
|
||||
private Long upstreamWorkflowId;
|
||||
// 依赖类型
|
||||
private DependencyType type;
|
||||
// 触发条件
|
||||
private String condition;
|
||||
public abstract class IdempotentNodeExecutor implements NodeExecutor {
|
||||
// 幂等性检查
|
||||
protected boolean checkIdempotent(String executionId) {
|
||||
return redisTemplate.opsForValue()
|
||||
.setIfAbsent("node:execution:" + executionId, "1", 24, TimeUnit.HOURS);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
2. 实现依赖服务
|
||||
```java
|
||||
@Service
|
||||
public class WorkflowDependencyService {
|
||||
public void handleWorkflowComplete(Long workflowInstanceId) {
|
||||
// 1. 查询依赖配置
|
||||
// 2. 检查触发条件
|
||||
// 3. 触发下游工作流
|
||||
// 4. 记录依赖执行
|
||||
}
|
||||
public class CompensationService {
|
||||
// 注册补偿操作
|
||||
public void registerCompensation(NodeInstance node, Runnable compensation);
|
||||
|
||||
// 执行补偿
|
||||
public void executeCompensation(WorkflowInstance instance);
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 工作流权限管理
|
||||
#### 2.3 扩展性优化
|
||||
- 支持自定义节点类型
|
||||
- 支持插件化扩展
|
||||
- 提供更多扩展点
|
||||
```java
|
||||
public interface WorkflowPlugin {
|
||||
// 插件初始化
|
||||
void init(WorkflowEngine engine);
|
||||
|
||||
#### 5.1 权限模型
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 定义权限模型
|
||||
```java
|
||||
@Entity
|
||||
@Table(name = "wf_permission")
|
||||
public class WorkflowPermission {
|
||||
// 权限类型
|
||||
private PermissionType type;
|
||||
// 权限范围
|
||||
private PermissionScope scope;
|
||||
// 权限值
|
||||
private String value;
|
||||
// 注册扩展点
|
||||
void registerExtensions();
|
||||
|
||||
// 清理资源
|
||||
void destroy();
|
||||
}
|
||||
|
||||
public class PluginManager {
|
||||
// 加载插件
|
||||
public void loadPlugins();
|
||||
|
||||
// 启用插件
|
||||
public void enablePlugin(String pluginId);
|
||||
|
||||
// 禁用插件
|
||||
public void disablePlugin(String pluginId);
|
||||
}
|
||||
```
|
||||
|
||||
2. 实现权限服务
|
||||
```java
|
||||
@Service
|
||||
public class WorkflowPermissionService {
|
||||
public boolean hasPermission(Long userId, Long workflowId, PermissionType type) {
|
||||
// 1. 查询用户权限
|
||||
// 2. 检查继承权限
|
||||
// 3. 验证权限范围
|
||||
// 4. 返回结果
|
||||
}
|
||||
### 3. 新特性规划
|
||||
|
||||
public void grantPermission(PermissionGrant grant) {
|
||||
// 1. 验证授权者权限
|
||||
// 2. 创建权限记录
|
||||
// 3. 记录授权日志
|
||||
}
|
||||
#### 3.1 工作流模板功能
|
||||
```java
|
||||
// 模板定义表
|
||||
CREATE TABLE wf_workflow_template (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
code VARCHAR(100) NOT NULL UNIQUE,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
content JSON NOT NULL,
|
||||
category VARCHAR(50),
|
||||
tags JSON,
|
||||
-- 其他基础字段
|
||||
);
|
||||
|
||||
// 模板参数表
|
||||
CREATE TABLE wf_template_parameter (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
template_id BIGINT NOT NULL,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
type VARCHAR(50) NOT NULL,
|
||||
required BIT NOT NULL DEFAULT 0,
|
||||
default_value VARCHAR(255),
|
||||
validation_rule VARCHAR(255),
|
||||
-- 其他基础字段
|
||||
);
|
||||
```
|
||||
|
||||
#### 3.2 工作流版本管理
|
||||
```java
|
||||
// 版本管理表
|
||||
CREATE TABLE wf_workflow_version (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
workflow_definition_id BIGINT NOT NULL,
|
||||
version VARCHAR(20) NOT NULL,
|
||||
content JSON NOT NULL,
|
||||
change_log TEXT,
|
||||
status VARCHAR(20) NOT NULL,
|
||||
-- 其他基础字段
|
||||
);
|
||||
|
||||
public interface VersionManager {
|
||||
// 创建新版本
|
||||
String createVersion(Long workflowId, String content);
|
||||
|
||||
// 发布版本
|
||||
void publishVersion(Long workflowId, String version);
|
||||
|
||||
// 回滚版本
|
||||
void rollbackVersion(Long workflowId, String version);
|
||||
}
|
||||
```
|
||||
|
||||
### 6. 工作流版本管理
|
||||
#### 3.3 工作流迁移功能
|
||||
```java
|
||||
public interface WorkflowMigration {
|
||||
// 导出工作流
|
||||
byte[] exportWorkflow(Long workflowId);
|
||||
|
||||
#### 6.1 版本控制
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 添加版本模型
|
||||
```java
|
||||
@Entity
|
||||
@Table(name = "wf_workflow_version")
|
||||
public class WorkflowVersion {
|
||||
// 版本号
|
||||
private String version;
|
||||
// 变更内容
|
||||
private String changelog;
|
||||
// 工作流定义
|
||||
private String definition;
|
||||
// 导入工作流
|
||||
Long importWorkflow(byte[] content);
|
||||
|
||||
// 迁移实例到新版本
|
||||
void migrateInstance(Long instanceId, String targetVersion);
|
||||
}
|
||||
|
||||
// 迁移记录表
|
||||
CREATE TABLE wf_workflow_migration (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
source_workflow_id BIGINT NOT NULL,
|
||||
target_workflow_id BIGINT NOT NULL,
|
||||
migration_type VARCHAR(50) NOT NULL,
|
||||
status VARCHAR(20) NOT NULL,
|
||||
error_message TEXT,
|
||||
-- 其他基础字段
|
||||
);
|
||||
```
|
||||
|
||||
2. 实现版本服务
|
||||
#### 3.4 工作流测试功能
|
||||
```java
|
||||
@Service
|
||||
public class WorkflowVersionService {
|
||||
public void createVersion(Long workflowId) {
|
||||
// 1. 生成版本号
|
||||
// 2. 保存当前定义
|
||||
// 3. 记录变更日志
|
||||
public interface WorkflowTesting {
|
||||
// 模拟执行
|
||||
TestResult simulateExecution(Long workflowId, Map<String, Object> variables);
|
||||
|
||||
// 节点单元测试
|
||||
TestResult testNode(NodeConfig config, Map<String, Object> inputs);
|
||||
|
||||
// 生成测试报告
|
||||
TestReport generateReport(Long testExecutionId);
|
||||
}
|
||||
|
||||
public void rollback(Long workflowId, String version) {
|
||||
// 1. 验证版本有效性
|
||||
// 2. 恢复历史版本
|
||||
// 3. 记录回滚操作
|
||||
}
|
||||
}
|
||||
// 测试用例表
|
||||
CREATE TABLE wf_workflow_test_case (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
workflow_definition_id BIGINT NOT NULL,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
variables JSON,
|
||||
expected_result JSON,
|
||||
-- 其他基础字段
|
||||
);
|
||||
|
||||
// 测试执行记录表
|
||||
CREATE TABLE wf_workflow_test_execution (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
test_case_id BIGINT NOT NULL,
|
||||
execution_time DATETIME NOT NULL,
|
||||
status VARCHAR(20) NOT NULL,
|
||||
actual_result JSON,
|
||||
error_message TEXT,
|
||||
-- 其他基础字段
|
||||
);
|
||||
```
|
||||
|
||||
### 7. 工作流测试
|
||||
## 三、技术架构
|
||||
|
||||
#### 7.1 模拟执行
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 实现测试环境
|
||||
```java
|
||||
@Component
|
||||
public class WorkflowTestEnvironment {
|
||||
public WorkflowContext createTestContext() {
|
||||
// 1. 创建测试上下文
|
||||
// 2. 初始化测试数据
|
||||
// 3. 配置测试参数
|
||||
}
|
||||
}
|
||||
### 1. 整体架构
|
||||
```
|
||||
+------------------+
|
||||
| API Layer |
|
||||
+------------------+
|
||||
| Service Layer |
|
||||
+------------------+
|
||||
| Engine Core |
|
||||
+------------------+
|
||||
| Storage Layer |
|
||||
+------------------+
|
||||
```
|
||||
|
||||
2. 实现测试服务
|
||||
```java
|
||||
@Service
|
||||
public class WorkflowTestService {
|
||||
public TestResult simulateExecution(Long workflowId) {
|
||||
// 1. 准备测试环境
|
||||
// 2. 执行工作流
|
||||
// 3. 收集测试结果
|
||||
// 4. 生成测试报告
|
||||
}
|
||||
}
|
||||
### 2. 关键组件
|
||||
- 工作流引擎核心
|
||||
- 节点执行引擎
|
||||
- 变量管理器
|
||||
- 日志管理器
|
||||
- 权限管理器
|
||||
- 调度管理器
|
||||
- 监控告警组件
|
||||
- 分析统计组件
|
||||
|
||||
### 3. 存储设计
|
||||
- 核心业务表
|
||||
- 执行记录表
|
||||
- 监控指标表
|
||||
- 分析统计表
|
||||
- 日志记录表
|
||||
|
||||
### 4. 缓存设计
|
||||
- 本地缓存
|
||||
- 工作流定义缓存
|
||||
- 节点配置缓存
|
||||
|
||||
- 分布式缓存
|
||||
- 执行状态缓存
|
||||
- 变量数据缓存
|
||||
|
||||
## 四、部署运维
|
||||
|
||||
### 1. 部署架构
|
||||
```
|
||||
+---------------+ +---------------+
|
||||
| API Server | | API Server |
|
||||
+---------------+ +---------------+
|
||||
| |
|
||||
+---------------+ +---------------+
|
||||
| Engine Worker | | Engine Worker |
|
||||
+---------------+ +---------------+
|
||||
| |
|
||||
+---------------+ +---------------+
|
||||
| Node Worker | | Node Worker |
|
||||
+---------------+ +---------------+
|
||||
```
|
||||
|
||||
### 8. 工作流模板
|
||||
### 2. 监控方案
|
||||
- 系统监控
|
||||
- JVM指标
|
||||
- 线程池状态
|
||||
- 数据库连接池
|
||||
|
||||
#### 8.1 模板管理
|
||||
```java
|
||||
// 实现思路:
|
||||
1. 添加模板模型
|
||||
```java
|
||||
@Entity
|
||||
@Table(name = "wf_workflow_template")
|
||||
public class WorkflowTemplate {
|
||||
// 模板名称
|
||||
private String name;
|
||||
// 模板描述
|
||||
private String description;
|
||||
// 模板定义
|
||||
private String definition;
|
||||
// 参数定义
|
||||
private List<TemplateParameter> parameters;
|
||||
}
|
||||
```
|
||||
- 业务监控
|
||||
- 工作流执行状态
|
||||
- 节点执行性能
|
||||
- 错误率统计
|
||||
|
||||
2. 实现模板服务
|
||||
```java
|
||||
@Service
|
||||
public class WorkflowTemplateService {
|
||||
public Long createFromTemplate(Long templateId, Map<String, Object> parameters) {
|
||||
// 1. 加载模板定义
|
||||
// 2. 替换模板参数
|
||||
// 3. 创建工作流定义
|
||||
// 4. 返回工作流ID
|
||||
}
|
||||
### 3. 告警方案
|
||||
- 系统告警
|
||||
- 资源使用率
|
||||
- 错误率阈值
|
||||
- 响应时间
|
||||
|
||||
public void saveAsTemplate(Long workflowId) {
|
||||
// 1. 提取工作流定义
|
||||
// 2. 提取参数定义
|
||||
// 3. 保存为模板
|
||||
}
|
||||
}
|
||||
```
|
||||
- 业务告警
|
||||
- 执行超时
|
||||
- 节点失败
|
||||
- 异常终止
|
||||
|
||||
## 下一步开发计划
|
||||
### 4. 运维工具
|
||||
- 管理控制台
|
||||
- 监控面板
|
||||
- 运维脚本
|
||||
- 诊断工具
|
||||
|
||||
1. 优先实现日志管理增强功能
|
||||
- 日志导出功能
|
||||
- 日志清理功能
|
||||
- 日志查询性能优化
|
||||
## 五、项目管理
|
||||
|
||||
2. 实现工作流监控功能
|
||||
- 执行监控
|
||||
- 告警通知
|
||||
- 监控大屏
|
||||
### 1. 开发计划
|
||||
- Phase 1: 核心功能实现 (已完成)
|
||||
- Phase 2: 高级特性开发 (进行中)
|
||||
- Phase 3: 性能优化和稳定性提升
|
||||
- Phase 4: 运维工具和监控体系建设
|
||||
|
||||
3. 实现剩余节点类型
|
||||
- Jenkins节点
|
||||
- Git节点
|
||||
- HTTP节点
|
||||
- 通知节点
|
||||
### 2. 测试策略
|
||||
- 单元测试
|
||||
- 集成测试
|
||||
- 性能测试
|
||||
- 稳定性测试
|
||||
|
||||
4. 实现工作流调度功能
|
||||
- 定时调度
|
||||
- 依赖调度
|
||||
- 调度监控
|
||||
### 3. 文档规划
|
||||
- 设计文档
|
||||
- API文档
|
||||
- 使用手册
|
||||
- 运维手册
|
||||
|
||||
## 技术栈
|
||||
|
||||
- 后端框架:Spring Boot 3.x
|
||||
- 数据库:MySQL 8.x
|
||||
- ORM框架:Spring Data JPA
|
||||
- 任务调度:Quartz
|
||||
- 监控:Micrometer + Prometheus
|
||||
- 日志:Logback
|
||||
- 工具库:
|
||||
- Apache Commons
|
||||
- Guava
|
||||
- MapStruct
|
||||
- Jackson
|
||||
### 4. 版本规划
|
||||
- v1.0: 基础功能版本
|
||||
- v1.1: 高级特性版本
|
||||
- v1.2: 性能优化版本
|
||||
- v2.0: 企业版本
|
||||
@ -73,14 +73,8 @@ public enum ResponseCode {
|
||||
EXTERNAL_SYSTEM_SYNC_FAILED(2503, "external.system.sync.failed"),
|
||||
EXTERNAL_SYSTEM_TYPE_NOT_SUPPORTED(2504, "external.system.type.not.supported"),
|
||||
|
||||
/**
|
||||
* Git系统认证方式错误
|
||||
*/
|
||||
// Git系统相关错误码
|
||||
EXTERNAL_SYSTEM_GIT_AUTH_TYPE_ERROR(2501, "Git系统只支持Token认证"),
|
||||
|
||||
/**
|
||||
* Git系统Token必填
|
||||
*/
|
||||
EXTERNAL_SYSTEM_GIT_TOKEN_REQUIRED(2502, "Git系统必须提供Token"),
|
||||
|
||||
// 仓库相关错误码 (2600-2699)
|
||||
@ -94,7 +88,34 @@ public enum ResponseCode {
|
||||
REPOSITORY_BRANCH_NAME_EXISTS(2621, "repository.branch.name.exists"),
|
||||
REPOSITORY_SYNC_IN_PROGRESS(2630, "repository.sync.in.progress"),
|
||||
REPOSITORY_SYNC_FAILED(2631, "repository.sync.failed"),
|
||||
REPOSITORY_SYNC_HISTORY_NOT_FOUND(2632, "repository.sync.history.not.found");
|
||||
REPOSITORY_SYNC_HISTORY_NOT_FOUND(2632, "repository.sync.history.not.found"),
|
||||
|
||||
// 工作流相关错误码 (2700-2799)
|
||||
WORKFLOW_NOT_FOUND(2700, "workflow.not.found"),
|
||||
WORKFLOW_CODE_EXISTS(2701, "workflow.code.exists"),
|
||||
WORKFLOW_NAME_EXISTS(2702, "workflow.name.exists"),
|
||||
WORKFLOW_DISABLED(2703, "workflow.disabled"),
|
||||
WORKFLOW_NOT_PUBLISHED(2704, "workflow.not.published"),
|
||||
WORKFLOW_ALREADY_PUBLISHED(2705, "workflow.already.published"),
|
||||
WORKFLOW_ALREADY_DISABLED(2706, "workflow.already.disabled"),
|
||||
WORKFLOW_INSTANCE_NOT_FOUND(2710, "workflow.instance.not.found"),
|
||||
WORKFLOW_INSTANCE_ALREADY_COMPLETED(2711, "workflow.instance.already.completed"),
|
||||
WORKFLOW_INSTANCE_ALREADY_CANCELED(2712, "workflow.instance.already.canceled"),
|
||||
WORKFLOW_INSTANCE_NOT_RUNNING(2713, "workflow.instance.not.running"),
|
||||
WORKFLOW_NODE_NOT_FOUND(2720, "workflow.node.not.found"),
|
||||
WORKFLOW_NODE_TYPE_NOT_SUPPORTED(2721, "workflow.node.type.not.supported"),
|
||||
WORKFLOW_NODE_CONFIG_INVALID(2722, "workflow.node.config.invalid"),
|
||||
WORKFLOW_NODE_EXECUTION_FAILED(2723, "workflow.node.execution.failed"),
|
||||
WORKFLOW_NODE_TIMEOUT(2724, "workflow.node.timeout"),
|
||||
WORKFLOW_VARIABLE_NOT_FOUND(2730, "workflow.variable.not.found"),
|
||||
WORKFLOW_VARIABLE_TYPE_INVALID(2731, "workflow.variable.type.invalid"),
|
||||
WORKFLOW_PERMISSION_DENIED(2740, "workflow.permission.denied"),
|
||||
WORKFLOW_APPROVAL_REQUIRED(2741, "workflow.approval.required"),
|
||||
WORKFLOW_APPROVAL_REJECTED(2742, "workflow.approval.rejected"),
|
||||
WORKFLOW_DEPENDENCY_NOT_SATISFIED(2750, "workflow.dependency.not.satisfied"),
|
||||
WORKFLOW_CIRCULAR_DEPENDENCY(2751, "workflow.circular.dependency"),
|
||||
WORKFLOW_SCHEDULE_INVALID(2752, "workflow.schedule.invalid"),
|
||||
WORKFLOW_CONCURRENT_LIMIT_EXCEEDED(2753, "workflow.concurrent.limit.exceeded");
|
||||
|
||||
private final int code;
|
||||
private final String messageKey; // 国际化消息key
|
||||
|
||||
@ -10,10 +10,55 @@ import lombok.Getter;
|
||||
@AllArgsConstructor
|
||||
public enum WorkflowStatusEnum {
|
||||
|
||||
// 工作流定义状态
|
||||
DRAFT("DRAFT", "草稿"),
|
||||
PUBLISHED("PUBLISHED", "已发布"),
|
||||
DISABLED("DISABLED", "已禁用");
|
||||
DISABLED("DISABLED", "已禁用"),
|
||||
|
||||
// 工作流实例状态
|
||||
PENDING("PENDING", "等待执行"),
|
||||
RUNNING("RUNNING", "执行中"),
|
||||
PAUSED("PAUSED", "已暂停"),
|
||||
COMPLETED("COMPLETED", "已完成"),
|
||||
FAILED("FAILED", "执行失败"),
|
||||
CANCELED("CANCELED", "已取消"),
|
||||
TIMEOUT("TIMEOUT", "已超时");
|
||||
|
||||
private final String code;
|
||||
private final String description;
|
||||
|
||||
/**
|
||||
* 判断是否为终态
|
||||
*/
|
||||
public boolean isFinalStatus() {
|
||||
return this == COMPLETED || this == FAILED || this == CANCELED || this == TIMEOUT;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为运行状态
|
||||
*/
|
||||
public boolean isRunning() {
|
||||
return this == RUNNING;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否可以暂停
|
||||
*/
|
||||
public boolean canPause() {
|
||||
return this == RUNNING;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否可以恢复
|
||||
*/
|
||||
public boolean canResume() {
|
||||
return this == PAUSED;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否可以取消
|
||||
*/
|
||||
public boolean canCancel() {
|
||||
return this == PENDING || this == RUNNING || this == PAUSED;
|
||||
}
|
||||
}
|
||||
@ -88,3 +88,37 @@ repository.branch.name.exists=分支名称"{0}"已存在
|
||||
repository.sync.in.progress=仓库同步正在进行中
|
||||
repository.sync.failed=仓库同步失败:{0}
|
||||
repository.sync.history.not.found=同步历史记录不存在
|
||||
|
||||
# 工作流相关错误消息
|
||||
workflow.definition.not.found=工作流定义不存在
|
||||
workflow.definition.code.exists=工作流定义编码"{0}"已存在
|
||||
workflow.definition.name.exists=工作流定义名称"{0}"已存在
|
||||
workflow.definition.invalid.content=工作流定义内容无效:{0}
|
||||
workflow.definition.not.published=工作流定义未发布
|
||||
workflow.definition.already.published=工作流定义已发布
|
||||
workflow.definition.cannot.delete=工作流定义已被使用,无法删除
|
||||
|
||||
workflow.instance.not.found=工作流实例不存在
|
||||
workflow.instance.already.started=工作流实例已启动
|
||||
workflow.instance.already.ended=工作流实例已结束
|
||||
workflow.instance.already.suspended=工作流实例已挂起
|
||||
workflow.instance.not.suspended=工作流实例未挂起
|
||||
workflow.instance.cannot.cancel=工作流实例无法取消
|
||||
workflow.instance.cannot.suspend=工作流实例无法挂起
|
||||
workflow.instance.cannot.resume=工作流实例无法恢复
|
||||
|
||||
workflow.node.not.found=工作流节点不存在
|
||||
workflow.node.type.not.supported=不支持的节点类型:{0}
|
||||
workflow.node.config.invalid=节点配置无效:{0}
|
||||
workflow.node.execution.failed=节点执行失败:{0}
|
||||
workflow.node.timeout=节点执行超时
|
||||
workflow.node.approval.rejected=节点审批被拒绝
|
||||
workflow.node.approval.canceled=节点审批已取消
|
||||
|
||||
workflow.variable.not.found=工作流变量不存在
|
||||
workflow.variable.required=工作流变量"{0}"为必填项
|
||||
workflow.variable.invalid=工作流变量"{0}"的值无效
|
||||
|
||||
workflow.permission.denied=无权操作此工作流
|
||||
workflow.operation.not.allowed=当前状态不允许此操作
|
||||
workflow.concurrent.operation=工作流正在执行其他操作,请稍后重试
|
||||
@ -59,3 +59,37 @@ permission.code.exists=权限编码 {0} 已存在
|
||||
permission.name.exists=权限名称 {0} 已存在
|
||||
permission.already.assigned=该权限已分配给角色
|
||||
permission.assign.failed=权限分配失败
|
||||
|
||||
# 工作流相关错误消息
|
||||
workflow.definition.not.found=工作流定义不存在
|
||||
workflow.definition.code.exists=工作流定义编码"{0}"已存在
|
||||
workflow.definition.name.exists=工作流定义名称"{0}"已存
|
||||
workflow.definition.invalid.content=工作流定义内容无效:{0}
|
||||
workflow.definition.not.published=工作流定义未发布
|
||||
workflow.definition.already.published=工作流定义已发布
|
||||
workflow.definition.cannot.delete=工作流定义已被使用,无法删除
|
||||
|
||||
workflow.instance.not.found=工作流实例不存在
|
||||
workflow.instance.already.started=工作流实例已启动
|
||||
workflow.instance.already.ended=工作流实例已结束
|
||||
workflow.instance.already.suspended=工作流实例已挂起
|
||||
workflow.instance.not.suspended=工作流实例未挂起
|
||||
workflow.instance.cannot.cancel=工作流实例无法取消
|
||||
workflow.instance.cannot.suspend=工作流实例无法挂起
|
||||
workflow.instance.cannot.resume=工作流实例无法恢复
|
||||
|
||||
workflow.node.not.found=工作流节点不存在
|
||||
workflow.node.type.not.supported=不支持的节点类型:{0}
|
||||
workflow.node.config.invalid=节点配置无效:{0}
|
||||
workflow.node.execution.failed=节点执行失败:{0}
|
||||
workflow.node.timeout=节点执行超时
|
||||
workflow.node.approval.rejected=节点审批被拒绝
|
||||
workflow.node.approval.canceled=节点审批已取消
|
||||
|
||||
workflow.variable.not.found=工作流变量不存在
|
||||
workflow.variable.required=工作流变量"{0}"为必填项
|
||||
workflow.variable.invalid=工作流变量"{0}"的值无效
|
||||
|
||||
workflow.permission.denied=无权操作此工作流
|
||||
workflow.operation.not.allowed=当前状态不允许此操作
|
||||
workflow.concurrent.operation=工作流正在执行其他操作,请稍后重试
|
||||
Loading…
Reference in New Issue
Block a user