using Bunny.Service.Job; using Quartz; using Quartz.Impl; namespace Bunny.Service.IService.Service; public class JobService : IJobService { /// /// 开启一个简单的工作 /// https://www.youtube.com/watch?v=CuHIScZKup8&list=PLSi1BNmQ61ZohCcl43UdAksg7X3_TSmly&index=6 /// public void StartSimpleJob() { var schedulerFactory = new StdSchedulerFactory(); // TODO 如果使用异步,必须使用await 和 async // var scheduler = schedulerFactory.GetScheduler(); var scheduler = schedulerFactory.GetScheduler().GetAwaiter().GetResult(); var jobDetail = JobBuilder.Create() .UsingJobData("username", "用户名") .UsingJobData("password", "密码") .WithIdentity("simpleJob", "简单的JOB") .Build(); var trigger = TriggerBuilder.Create() .WithIdentity("testTrigger", "测试发出器") .StartNow() // 每隔5秒执行一次,一共重复10次 .WithSimpleSchedule(x => x.WithIntervalInSeconds(1).WithRepeatCount(10)) .Build(); // 使用同步方法 scheduler.ScheduleJob(jobDetail, trigger).GetAwaiter().GetResult(); scheduler.Start().GetAwaiter().GetResult(); // TODO 使用异步 // await _scheduler.ScheduleJob(jobDetail, trigger); // await _scheduler.Start(); } /// /// 将jobDetail放在触发器中 /// public void PutJobDetail4Trigger() { var stdSchedulerFactory = new StdSchedulerFactory(); var scheduler = stdSchedulerFactory.GetScheduler().GetAwaiter().GetResult(); var jobDetail = JobBuilder.Create() .UsingJobData("username", "用户名") .UsingJobData("password", "密码") // TODO 如果不设置持久的会报错; // TODO Jobs added with no trigger must be durable.Quartz.SchedulerException: Jobs added with no trigger must be durable. .StoreDurably() // 设置作业为持久的 .WithIdentity("simpleJob", "简单的JOB") .Build(); // 将作业添加到工作中 scheduler.AddJob(jobDetail, true).GetAwaiter().GetResult(); var trigger = TriggerBuilder.Create() .ForJob(jobDetail) .UsingJobData("trigger", "trigger值") .WithIdentity("testTrigger", "测试发出器") .StartNow() // TODO 设置调度时间单位 // .WithSimpleSchedule(x => x.WithIntervalInSeconds(1).WithRepeatCount(10)) // TODO 自定义调度时间单位 .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromMinutes(1)).WithRepeatCount(10)) .Build(); scheduler.ScheduleJob(trigger).GetAwaiter().GetResult(); scheduler.Start().GetAwaiter().GetResult(); } /// /// 设置每日时间表 /// public void SetJobWithDaily() { var stdSchedulerFactory = new StdSchedulerFactory(); var scheduler = stdSchedulerFactory.GetScheduler().GetAwaiter().GetResult(); var jobDetail = JobBuilder.Create() .UsingJobData("username", "用户名") .UsingJobData("password", "密码") .StoreDurably() // 设置作业为持久的 .WithIdentity("simpleJob", "简单的JOB") .Build(); scheduler.AddJob(jobDetail, true).GetAwaiter().GetResult(); var trigger = TriggerBuilder.Create() .ForJob(jobDetail) .UsingJobData("trigger", "trigger值") .WithIdentity("testTrigger", "测试发出器") .StartNow() // TODO StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(20, 0)):触发器从每天的20:00(晚上8点)开始。 // TODO EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 0)):触发器在每天的22:00(晚上10点)结束。 // TODO WithIntervalInSeconds(2):在开始和结束时间之间,触发器将每2秒触发一次作业。 .WithDailyTimeIntervalSchedule(x => x.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(16, 0)) .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 0)) // 设置工作时间在每周的星期几 .OnDaysOfTheWeek(DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Thursday) .WithIntervalInSeconds(2) ) .Build(); var trigger2 = TriggerBuilder.Create() .ForJob(jobDetail) .UsingJobData("trigger", "trigger值") .WithIdentity("testTrigger", "测试发出器") .StartNow() // WithIntervalInDays(1):触发器将按照日历间隔,每天触发一次。 // PreserveHourOfDayAcrossDaylightSavings(true):这个选项指示调度器在夏令时变更时保持小时不变。例如,如果作业在凌晨2点执行,夏令时开始或结束时,作业仍然会在凌晨2点执行,调度器会自动调整时间以适应夏令时的变化。 // SkipDayIfHourDoesNotExist(true):如果由于夏令时变更导致指定的小时不存在(例如,在夏令时开始时,从凌晨1点跳到凌晨3点),调度器将跳过这一天,不会执行作业。 .WithCalendarIntervalSchedule(x => x.WithIntervalInDays(1) .PreserveHourOfDayAcrossDaylightSavings(true) .SkipDayIfHourDoesNotExist(true) ) .Build(); scheduler.ScheduleJob(trigger).GetAwaiter().GetResult(); scheduler.Start().GetAwaiter().GetResult(); } }