2024-08-14 23:57:43 +08:00
|
|
|
|
using Bunny.Service.Job;
|
|
|
|
|
using Quartz;
|
|
|
|
|
using Quartz.Impl;
|
|
|
|
|
|
|
|
|
|
namespace Bunny.Service.IService.Service;
|
|
|
|
|
|
|
|
|
|
public class JobService : IJobService
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 开启一个简单的工作
|
|
|
|
|
/// https://www.youtube.com/watch?v=CuHIScZKup8&list=PLSi1BNmQ61ZohCcl43UdAksg7X3_TSmly&index=6
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void StartSimpleJob()
|
|
|
|
|
{
|
|
|
|
|
var schedulerFactory = new StdSchedulerFactory();
|
|
|
|
|
// TODO 如果使用异步,必须使用await 和 async
|
|
|
|
|
// var scheduler = schedulerFactory.GetScheduler();
|
|
|
|
|
var scheduler = schedulerFactory.GetScheduler().GetAwaiter().GetResult();
|
|
|
|
|
|
|
|
|
|
var jobDetail = JobBuilder.Create<SimJob>()
|
|
|
|
|
.UsingJobData("username", "用户名")
|
|
|
|
|
.UsingJobData("password", "密码")
|
|
|
|
|
.WithIdentity("simpleJob", "简单的JOB")
|
|
|
|
|
.Build();
|
|
|
|
|
var trigger = TriggerBuilder.Create()
|
|
|
|
|
.WithIdentity("testTrigger", "测试发出器")
|
|
|
|
|
.StartNow()
|
|
|
|
|
// 每隔5秒执行一次,一共重复10次
|
2024-08-15 16:23:34 +08:00
|
|
|
|
.WithSimpleSchedule(x => x.WithIntervalInSeconds(1).WithRepeatCount(10))
|
2024-08-14 23:57:43 +08:00
|
|
|
|
.Build();
|
|
|
|
|
|
|
|
|
|
// 使用同步方法
|
|
|
|
|
scheduler.ScheduleJob(jobDetail, trigger).GetAwaiter().GetResult();
|
|
|
|
|
scheduler.Start().GetAwaiter().GetResult();
|
|
|
|
|
|
|
|
|
|
// TODO 使用异步
|
|
|
|
|
// await _scheduler.ScheduleJob(jobDetail, trigger);
|
|
|
|
|
// await _scheduler.Start();
|
|
|
|
|
}
|
2024-08-15 16:23:34 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 将jobDetail放在触发器中
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void PutJobDetail4Trigger()
|
|
|
|
|
{
|
|
|
|
|
var stdSchedulerFactory = new StdSchedulerFactory();
|
|
|
|
|
var scheduler = stdSchedulerFactory.GetScheduler().GetAwaiter().GetResult();
|
|
|
|
|
|
|
|
|
|
var jobDetail = JobBuilder.Create<SimJob>()
|
|
|
|
|
.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();
|
|
|
|
|
}
|
2024-08-15 16:37:31 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 设置每日时间表
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void SetJobWithDaily()
|
|
|
|
|
{
|
|
|
|
|
var stdSchedulerFactory = new StdSchedulerFactory();
|
|
|
|
|
var scheduler = stdSchedulerFactory.GetScheduler().GetAwaiter().GetResult();
|
|
|
|
|
|
|
|
|
|
var jobDetail = JobBuilder.Create<SimJob>()
|
|
|
|
|
.UsingJobData("username", "用户名")
|
|
|
|
|
.UsingJobData("password", "密码")
|
|
|
|
|
.StoreDurably() // 设置作业为持久的
|
|
|
|
|
.WithIdentity("simpleJob", "简单的JOB")
|
|
|
|
|
.Build();
|
2024-08-15 16:43:45 +08:00
|
|
|
|
|
|
|
|
|
scheduler.AddJob(jobDetail, true).GetAwaiter().GetResult();
|
2024-08-15 16:37:31 +08:00
|
|
|
|
|
|
|
|
|
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点)结束。
|
2024-08-15 16:43:45 +08:00
|
|
|
|
// TODO WithIntervalInSeconds(2):在开始和结束时间之间,触发器将每2秒触发一次作业。
|
2024-08-15 16:37:31 +08:00
|
|
|
|
.WithDailyTimeIntervalSchedule(x => x.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(16, 0))
|
|
|
|
|
.EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 0))
|
2024-08-15 16:43:45 +08:00
|
|
|
|
// 设置工作时间在每周的星期几
|
2024-08-15 16:37:31 +08:00
|
|
|
|
.OnDaysOfTheWeek(DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Thursday)
|
|
|
|
|
.WithIntervalInSeconds(2)
|
|
|
|
|
)
|
|
|
|
|
.Build();
|
|
|
|
|
|
2024-08-15 16:43:45 +08:00
|
|
|
|
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();
|
|
|
|
|
|
2024-08-15 16:37:31 +08:00
|
|
|
|
scheduler.ScheduleJob(trigger).GetAwaiter().GetResult();
|
|
|
|
|
scheduler.Start().GetAwaiter().GetResult();
|
|
|
|
|
}
|
2024-08-14 23:57:43 +08:00
|
|
|
|
}
|