
CodeSpirit.ScheduledTasks 是一个基于分布式缓存的定时任务组件,专为 CodeSpirit 框架设计。该组件支持分布式执行、超时终止、配置文件定义任务等功能,无需数据库依赖。

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Web UI │ │ API Services │ │ Background │
│ (AMIS) │ │ │ │ Services │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
┌─────────────────────────────────────────────────┐
│ Core Services Layer │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ TaskService │ │ QueryService │ │
│ └─────────────────┘ └─────────────────┘ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ TaskExecutor │ │ TaskScheduler │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────┐
│ Infrastructure Layer │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Cache Service │ │ Lock Provider │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────┘
│
┌─────────────────┐
│ Redis │
│ (Cache/Lock) │
└─────────────────┘ounter(lineounter(lineounter(lineounter(line
CodeSpirit:ScheduledTasks:Tasks:{TaskId} -> 任务定义
CodeSpirit:ScheduledTasks:Executions:{ExecId} -> 执行记录
CodeSpirit:ScheduledTasks:Index:Active -> 活跃任务索引
CodeSpirit:ScheduledTasks:Lock:{TaskId} -> 分布式锁在 Program.cs 中注册服务:
ounter(line
builder.Services.AddCodeSpiritScheduledTasks(builder.Configuration, "YourServiceName");在 appsettings.json 中添加配置:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
{
"ScheduledTasks": {
"Enabled": true,
"DefaultTimeout": "00:30:00",
"MaxConcurrentTasks": 10,
"TaskCleanupInterval": "01:00:00",
"ExecutionHistoryRetention": "7.00:00:00",
"Tasks": [
{
"Id": "daily-cleanup",
"Name": "每日清理任务",
"Description": "清理过期数据",
"Type": "Cron",
"CronExpression": "0 2 * * *",
"Timeout": "00:15:00",
"Enabled": true,
"HandlerType": "YourApp.Tasks.DailyCleanupTaskHandler"
}
]
}
}实现 ITaskHandler 接口:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
public class DailyCleanupTaskHandler : ITaskHandler
{
private readonly ILogger<DailyCleanupTaskHandler> _logger;
public async Task ExecuteAsync(TaskExecutionContext context, CancellationToken cancellationToken)
{
_logger.LogInformation("开始执行清理任务");
// 实现任务逻辑
await DoCleanupAsync(cancellationToken);
_logger.LogInformation("清理任务执行完成");
}
}注册处理器:
ounter(line
builder.Services.AddScoped<DailyCleanupTaskHandler>();使用Cron表达式定义周期性执行的任务,支持秒级精度。
常用Cron表达式示例:
0 * * * * ? - 每分钟执行0 0 * * * ? - 每小时执行0 0 2 * * ? - 每天凌晨2点执行0 0 9 ? * MON - 每周一上午9点执行0 0 0 1 * ? - 每月1号凌晨执行指定在某个时间点执行一次的任务,适用于定时通知、延迟处理等场景。
组件使用分布式锁确保任务在多实例环境下不重复执行:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
// 任务管理
Task<ScheduledTask> CreateTaskAsync(ScheduledTask task);
Task<ScheduledTask?> UpdateTaskAsync(ScheduledTask task);
Task<bool> DeleteTaskAsync(string taskId);
Task<ScheduledTask?> GetTaskAsync(string taskId);
// 任务控制
Task<bool> EnableTaskAsync(string taskId);
Task<bool> DisableTaskAsync(string taskId);
Task<string> TriggerTaskAsync(string taskId);
Task<bool> CancelExecutionAsync(string executionId);
// 配置管理
Task<int> LoadTasksFromConfigurationAsync();ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
// 任务查询
Task<PageList<ScheduledTask>> GetTasksPagedAsync(TaskQueryDto queryDto);
Task<PageList<TaskExecution>> GetExecutionHistoryAsync(string taskId, QueryDtoBase queryDto);
Task<PageList<TaskExecution>> GetAllExecutionHistoryAsync(ExecutionQueryDto queryDto);
Task<List<TaskExecution>> GetRunningExecutionsAsync();
// 统计信息
Task<TaskStatistics> GetTaskStatisticsAsync();组件提供了完整的基于AMIS的Web管理界面,访问路径:/api/scheduled-tasks
配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Enabled | bool | true | 是否启用定时任务功能 |
DefaultTimeout | TimeSpan | 00:30:00 | 默认任务超时时间 |
MaxConcurrentTasks | int | 10 | 最大并发执行任务数 |
TaskCleanupInterval | TimeSpan | 01:00:00 | 任务清理检查间隔 |
ExecutionHistoryRetention | TimeSpan | 7.00:00:00 | 执行历史保留时长 |
Tasks | array | [] | 预定义的任务列表 |
字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
Id | string | 是 | 任务唯一标识 |
Name | string | 是 | 任务名称 |
Description | string | 否 | 任务描述 |
Type | enum | 是 | 任务类型(Cron/OneTime) |
CronExpression | string | 条件 | Cron表达式(Cron类型必填) |
ScheduledTime | DateTime | 条件 | 计划执行时间(OneTime类型必填) |
HandlerType | string | 是 | 任务处理器完整类型名称 |
Timeout | TimeSpan | 否 | 超时时间(使用默认值) |
Enabled | bool | 否 | 是否启用(默认true) |
可能原因:
排查步骤:
可能原因:
排查步骤:
可能原因:
解决方案:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
Src/Components/CodeSpirit.ScheduledTasks/
├── Models/ # 数据模型
│ ├── ScheduledTask.cs # 定时任务模型
│ ├── TaskExecution.cs # 任务执行记录
│ ├── TaskStatus.cs # 任务状态枚举
│ └── ExecutionStatus.cs # 执行状态枚举
├── Configuration/ # 配置选项
│ └── ScheduledTasksOptions.cs
├── Services/ # 服务实现
│ ├── IScheduledTaskService.cs
│ ├── ScheduledTaskService.cs
│ ├── IScheduledTaskQueryService.cs
│ ├── ScheduledTaskQueryService.cs
│ ├── ITaskExecutor.cs
│ └── TaskExecutor.cs
├── Background/ # 后台服务
│ └── ScheduledTaskBackgroundService.cs
├── Extensions/ # 扩展方法
│ └── ServiceCollectionExtensions.cs
└── Helpers/ # 辅助类
├── CronHelper.cs
└── TaskTimeoutHelper.cs组件包含完整的单元测试和集成测试:
ounter(lineounter(line
# 运行测试
dotnet test Tests/Components/CodeSpirit.ScheduledTasks.Tests/测试覆盖:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
{
"ScheduledTasks": {
"Enabled": true,
"DefaultTimeout": "00:30:00",
"MaxConcurrentTasks": 20,
"TaskCleanupInterval": "00:30:00",
"ExecutionHistoryRetention": "30.00:00:00"
}
}