wankeda
2025-04-07 4da42c12efde190b208f18b7dd51d3e89986837d
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/Quartzjob/JobSetup.cs
@@ -10,39 +10,79 @@
namespace WIDESEA_Core.QuartzJob
{
    /// <summary>
    /// ä»»åŠ¡è°ƒåº¦ å¯åŠ¨æœåŠ¡
    /// </summary>
    public static class JobSetup
    {
        public static void AddJobSetup(this IServiceCollection services)
        public static void AddJobSetup(this IServiceCollection services, Action<IServiceCollection> configureJobs = null)
        {
            if (services == null) throw new ArgumentNullException(nameof(services));
            //将JobFactory注入到服务中
            // å°†JobFactory注入到服务中
            services.AddSingleton<IJobFactory, JobFactory>();
            //将SchedulerCenterServer注入到服务中
            // å°†SchedulerCenterServer注入到服务中
            services.AddSingleton<ISchedulerCenter, SchedulerCenterServer>();
            //任务注入
            // ä»»åŠ¡æ³¨å…¥
            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的类型
                // ç­›é€‰å‡ºç»§æ‰¿è‡ªIJob的类型
                .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray();
            //获取所有实现了IJob的类型
            // èŽ·å–æ‰€æœ‰å®žçŽ°äº†IJob的类型
            var implementTypes = types.Where(x => x.IsClass).ToArray();
            //将所有实现了IJob的类型注入到服务中
            // å°†æ‰€æœ‰å®žçŽ°äº†IJob的类型注入到服务中
            foreach (var implementType in implementTypes)
            {
                services.AddTransient(implementType);
            }
            // æ·»åŠ å®šæ—¶å¯åŠ¨é…ç½®
            services.AddTransient<StartupJob>();
            services.AddSingleton(new JobSchedule(
                jobType: typeof(StartupJob),
                cronExpression: "0 0 8 ? * *")); // æ¯å¤©ä¸Šåˆ8点执行
        }
    }
}
    /// <summary>
    /// å¯åŠ¨ä»»åŠ¡
    /// </summary>
    public class StartupJob : IJob
    {
        private readonly ISchedulerCenter _schedulerCenter;
        public StartupJob(ISchedulerCenter schedulerCenter)
        {
            _schedulerCenter = schedulerCenter;
        }
        public async Task Execute(IJobExecutionContext context)
        {
            // åœ¨è¿™é‡Œå¯åŠ¨æ‰€æœ‰éœ€è¦å®šæ—¶æ‰§è¡Œçš„ä»»åŠ¡
            await _schedulerCenter.StartScheduleAsync();
        }
    }
    /// <summary>
    /// ä»»åŠ¡è°ƒåº¦é…ç½®
    /// </summary>
    public class JobSchedule
    {
        public Type JobType { get; }
        public string CronExpression { get; }
        public JobSchedule(Type jobType, string cronExpression)
        {
            JobType = jobType;
            CronExpression = cronExpression;
        }
    }
}