mirror of
https://github.com/babalae/better-genshin-impact.git
synced 2026-05-25 10:05:49 +08:00
Implement Quartz.NET integration with dynamic task management
Co-authored-by: huiyadanli <15783049+huiyadanli@users.noreply.github.com>
This commit is contained in:
224
BetterGenshinImpact/Examples/QuartzExampleProgram.cs
Normal file
224
BetterGenshinImpact/Examples/QuartzExampleProgram.cs
Normal file
@@ -0,0 +1,224 @@
|
||||
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;
|
||||
|
||||
/// <summary>
|
||||
/// Quartz.NET 动态任务管理示例程序
|
||||
/// 演示如何在控制台应用中使用调度功能
|
||||
/// </summary>
|
||||
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<SchedulerManager>();
|
||||
var dynamicTaskService = host.Services.GetRequiredService<DynamicTaskExampleService>();
|
||||
|
||||
// 运行示例
|
||||
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<SchedulerManager>();
|
||||
services.AddSingleton<DynamicTaskExampleService>();
|
||||
services.AddHostedService<QuartzHostedService>();
|
||||
|
||||
// 注册模拟的脚本服务
|
||||
services.AddSingleton<MockScriptService>();
|
||||
});
|
||||
|
||||
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<ScriptGroup> { 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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 模拟脚本服务,用于演示
|
||||
/// </summary>
|
||||
public class MockScriptService : BetterGenshinImpact.Service.Interface.IScriptService
|
||||
{
|
||||
private readonly ILogger<MockScriptService> _logger;
|
||||
|
||||
public MockScriptService(ILogger<MockScriptService> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task RunMulti(List<ScriptGroupProject> 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user