using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using BetterGenshinImpact.Core.Script.Group;
using BetterGenshinImpact.Service.Quartz;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Quartz;
namespace BetterGenshinImpact.Examples;
///
/// Quartz.NET 动态任务管理示例程序
/// 演示如何在控制台应用中使用调度功能
///
public class QuartzExampleProgram
{
public static async Task Main(string[] args)
{
Console.WriteLine("=== Quartz.NET 动态任务管理示例 ===\n");
// 创建主机和服务
var host = CreateHostBuilder(args).Build();
try
{
// 启动主机
await host.StartAsync();
// 获取服务
var schedulerManager = host.Services.GetRequiredService();
var dynamicTaskService = host.Services.GetRequiredService();
// 运行示例
await RunExamples(schedulerManager, dynamicTaskService);
Console.WriteLine("\n按任意键退出...");
Console.ReadKey();
}
finally
{
await host.StopAsync();
}
}
private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
// 注册 Quartz.NET
services.AddQuartz(q =>
{
q.UseInMemoryStore();
q.UseDefaultThreadPool(tp => tp.MaxConcurrency = 5);
});
// 注册自定义服务
services.AddSingleton();
services.AddSingleton();
services.AddHostedService();
// 注册模拟的脚本服务
services.AddSingleton();
});
private static async Task RunExamples(SchedulerManager schedulerManager, DynamicTaskExampleService dynamicTaskService)
{
// 创建示例脚本组
var scriptGroup1 = CreateExampleScriptGroup("每日任务组", "Daily");
var scriptGroup2 = CreateExampleScriptGroup("每周任务组", "Monday");
var scriptGroup3 = CreateExampleScriptGroup("自定义任务组", "0 0/15 * * * ? *"); // 每15分钟
Console.WriteLine("1. 添加定时任务示例");
Console.WriteLine("===================");
// 示例1:添加每日任务
Console.WriteLine("添加每日任务(每天8:30执行)...");
bool success1 = await dynamicTaskService.CreateDailyTaskAsync(scriptGroup1, 8, 30);
Console.WriteLine($"结果: {(success1 ? "成功" : "失败")}\n");
// 示例2:添加每周任务
Console.WriteLine("添加每周任务(每周一9:00执行)...");
bool success2 = await dynamicTaskService.CreateWeeklyTaskAsync(scriptGroup2, 1, 9, 0);
Console.WriteLine($"结果: {(success2 ? "成功" : "失败")}\n");
// 示例3:添加自定义Cron表达式任务
Console.WriteLine("添加自定义任务(每15分钟执行)...");
bool success3 = await schedulerManager.AddScheduledTaskAsync(scriptGroup3, "0 0/15 * * * ? *");
Console.WriteLine($"结果: {(success3 ? "成功" : "失败")}\n");
// 示例4:批量添加任务
Console.WriteLine("2. 批量操作示例");
Console.WriteLine("================");
var scriptGroups = new List { scriptGroup1, scriptGroup2, scriptGroup3 };
int batchCount = await dynamicTaskService.AddMultipleScriptGroupSchedulesAsync(scriptGroups, "0 0 12 * * ? *");
Console.WriteLine($"批量添加任务结果: 成功添加 {batchCount} 个任务\n");
// 示例5:查看所有任务
Console.WriteLine("3. 查看任务状态");
Console.WriteLine("===============");
var allTasks = await schedulerManager.GetAllScheduledTasksAsync();
Console.WriteLine($"当前总任务数: {allTasks.Count}");
foreach (var task in allTasks)
{
Console.WriteLine($"- 任务: {task.JobName}");
Console.WriteLine($" 脚本组: {task.ScriptGroupName}");
Console.WriteLine($" Cron表达式: {task.CronExpression}");
Console.WriteLine($" 下次执行: {task.NextFireTime?.ToString("yyyy-MM-dd HH:mm:ss") ?? "未安排"}");
Console.WriteLine();
}
// 示例6:生成任务报告
Console.WriteLine("4. 任务执行报告");
Console.WriteLine("===============");
var report = await dynamicTaskService.GetScheduledTaskReportAsync();
Console.WriteLine($"总任务数: {report.TotalTasks}");
Console.WriteLine($"活跃任务数: {report.ActiveTasks}");
Console.WriteLine("按脚本组统计:");
foreach (var group in report.TasksByScriptGroup)
{
Console.WriteLine($" {group.Key}: {group.Value} 个任务");
}
Console.WriteLine("\n即将执行的任务:");
foreach (var execution in report.NextExecutions.Take(5))
{
Console.WriteLine($" {execution.ScriptGroupName} - {execution.NextFireTime:yyyy-MM-dd HH:mm:ss}");
}
Console.WriteLine();
// 示例7:任务管理操作
Console.WriteLine("5. 任务管理操作");
Console.WriteLine("===============");
// 暂停任务
if (allTasks.Count > 0)
{
var firstTask = allTasks[0];
Console.WriteLine($"暂停任务: {firstTask.JobName}");
bool pauseResult = await schedulerManager.PauseScheduledTaskAsync(firstTask.JobName);
Console.WriteLine($"暂停结果: {(pauseResult ? "成功" : "失败")}");
// 等待一秒
await Task.Delay(1000);
// 恢复任务
Console.WriteLine($"恢复任务: {firstTask.JobName}");
bool resumeResult = await schedulerManager.ResumeScheduledTaskAsync(firstTask.JobName);
Console.WriteLine($"恢复结果: {(resumeResult ? "成功" : "失败")}");
}
Console.WriteLine();
// 示例8:更新任务
if (allTasks.Count > 0)
{
var firstTask = allTasks[0];
var newCron = "0 0 10 * * ? *"; // 每天10点执行
Console.WriteLine($"更新任务Cron表达式: {firstTask.JobName}");
Console.WriteLine($"新的Cron表达式: {newCron}");
bool updateResult = await schedulerManager.UpdateScheduledTaskAsync(firstTask.JobName, newCron);
Console.WriteLine($"更新结果: {(updateResult ? "成功" : "失败")}");
}
Console.WriteLine();
// 示例9:清理任务
Console.WriteLine("6. 清理任务");
Console.WriteLine("===========");
int cleanupCount = await dynamicTaskService.ClearAllScheduledTasksAsync();
Console.WriteLine($"清理结果: 删除了 {cleanupCount} 个任务");
}
private static ScriptGroup CreateExampleScriptGroup(string name, string schedule)
{
var scriptGroup = new ScriptGroup
{
Name = name,
Index = 1
};
// 添加示例项目
var project = new ScriptGroupProject
{
Name = $"{name}_脚本",
FolderName = "example",
Type = "Javascript",
Status = "Enabled",
Schedule = schedule,
Index = 1
};
scriptGroup.AddProject(project);
return scriptGroup;
}
}
///
/// 模拟脚本服务,用于演示
///
public class MockScriptService : BetterGenshinImpact.Service.Interface.IScriptService
{
private readonly ILogger _logger;
public MockScriptService(ILogger logger)
{
_logger = logger;
}
public async Task RunMulti(List projects, string groupName, object? taskProgress)
{
_logger.LogInformation("模拟执行脚本组: {GroupName},包含 {ProjectCount} 个项目", groupName, projects.Count);
foreach (var project in projects)
{
_logger.LogInformation("执行项目: {ProjectName} ({ProjectType})", project.Name, project.Type);
// 模拟执行时间
await Task.Delay(100);
}
_logger.LogInformation("脚本组 {GroupName} 执行完成", groupName);
}
}