using Microsoft.Extensions.DependencyInjection; using Quartz.Spi; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace WIDESEA_Core.QuartzJob { /// /// 任务调度 启动服务 /// public static class JobSetup { public static void AddJobSetup(this IServiceCollection services, Action configureJobs = null) { if (services == null) throw new ArgumentNullException(nameof(services)); // 将JobFactory注入到服务中 services.AddSingleton(); // 将SchedulerCenterServer注入到服务中 services.AddSingleton(); // 任务注入 var baseType = typeof(IJob); // 获取当前应用程序域的相对搜索路径 var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; // 获取指定路径下的所有程序集 var referencedAssemblies = System.IO.Directory.GetFiles(path, "WIDESEA_Tasks.dll").Select(Assembly.LoadFrom).ToArray(); // 获取所有定义的类型 var types = referencedAssemblies .SelectMany(a => a.DefinedTypes) .Select(type => type.AsType()) // 筛选出继承自IJob的类型 .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray(); // 获取所有实现了IJob的类型 var implementTypes = types.Where(x => x.IsClass).ToArray(); // 将所有实现了IJob的类型注入到服务中 foreach (var implementType in implementTypes) { services.AddTransient(implementType); } // 添加定时启动配置 services.AddTransient(); services.AddSingleton(new JobSchedule( jobType: typeof(StartupJob), cronExpression: "0 0 8 ? * *")); // 每天上午8点执行 } } /// /// 启动任务 /// public class StartupJob : IJob { private readonly ISchedulerCenter _schedulerCenter; public StartupJob(ISchedulerCenter schedulerCenter) { _schedulerCenter = schedulerCenter; } public async Task Execute(IJobExecutionContext context) { // 在这里启动所有需要定时执行的任务 await _schedulerCenter.StartScheduleAsync(); } } /// /// 任务调度配置 /// public class JobSchedule { public Type JobType { get; } public string CronExpression { get; } public JobSchedule(Type jobType, string cronExpression) { JobType = jobType; CronExpression = cronExpression; } } }