using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Quartz; using YhCore.Tasks.Jobs; namespace YhCore.Tasks { /// /// Quartz 调度宿主(对应 Java scheduler 包由 Spring 管理的调度器)。 /// 承载框架内置 Job 模板;业务 Job 在 InitJobs 中追加注册。 /// public class QuartzHostedService : IHostedService { private const string ServiceProviderKey = "services"; private readonly ISchedulerFactory _schedulerFactory; private readonly IServiceProvider _serviceProvider; private IScheduler _scheduler; public QuartzHostedService(ISchedulerFactory schedulerFactory, IServiceProvider serviceProvider) { _schedulerFactory = schedulerFactory; _serviceProvider = serviceProvider; } public async Task StartAsync(CancellationToken cancellationToken) { _scheduler = await _schedulerFactory.GetScheduler(cancellationToken); _scheduler.Context.Put(ServiceProviderKey, _serviceProvider); // Job 经此取 DI 服务 await InitJobs(); await _scheduler.Start(cancellationToken); } public async Task StopAsync(CancellationToken cancellationToken) { if (_scheduler != null) { await _scheduler.Shutdown(waitForJobsToComplete: true, cancellationToken); } } private async Task InitJobs() { // ============ 定时任务注册 ============ // 1. 审计日志清理(对应 Java SysOperationLogCleanupTask:每日凌晨 1:00 删除 30 天前 sys_operation_log 数据; // 设定时间窗口 0-2 点,取 1:00 居中) await ScheduleJobAsync("cleanup-log-job", "0 0 1 * * ?"); // 2. 其他业务 Job 在此追加注册(示例:每 10 分钟执行一次) // await ScheduleJobAsync("job-name", "0 */10 * * * ?"); await Task.CompletedTask; } /// 注册一个 Cron 定时任务 protected async Task ScheduleJobAsync(string jobName, string cronExpression) where TJob : IJob { var job = JobBuilder.Create() .WithIdentity(jobName) .Build(); var trigger = TriggerBuilder.Create() .WithIdentity(jobName + "-trigger") .WithCronSchedule(cronExpression) .Build(); await _scheduler.ScheduleJob(job, trigger); } } }