Quartz 任务调度
- 安装Quartz NuGet包 2.6.2版本
- 创建Job文件夹
- 创建QuartzHelper帮助类
public class QuartzHelper
{
private static List<IScheduler> _listsche = new List<IScheduler>();
/// <summary>
/// 时间间隔执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="seconds">时间间隔(单位:毫秒)</param>
public static async System.Threading.Tasks.Task ExecuteIntervalAsync<T>(int seconds) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = await factory.GetScheduler();
//IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
IJobDetail job = JobBuilder.Create<T>().Build();
ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
.Build();
_listsche.Add(scheduler);
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
}
/// <summary>
/// 指定时间执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
public static void ExecuteByCron<T>(string cronExpression) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = (IScheduler)factory.GetScheduler();
IJobDetail job = JobBuilder.Create<T>().Build();
//DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
//DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3);
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
// .StartAt(startTime).EndAt(endTime)
.WithCronSchedule(cronExpression)
.StartNow()
.Build();
_listsche.Add(scheduler);
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
//Thread.Sleep(TimeSpan.FromDays(2));
//scheduler.Shutdown();
}
/// <summary>
/// 每隔 seconds秒 ,重复执行times次 (如:times=-1重复执行;times=0只执行一次;
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seconds"></param>
/// <param name="times"></param>
public static void ExecuteIntervalTime<T>(int seconds, int times) where T : IJob
{
try
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = (IScheduler)factory.GetScheduler();
//IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
IJobDetail job = JobBuilder.Create<T>().Build();
ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).WithRepeatCount(times))
.Build();
_listsche.Add(scheduler);
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
}
catch (Exception ex)
{
}
}
public static void ExecuteIntervalTime<T>(int seconds, int times, JobDataMap map) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = (IScheduler)factory.GetScheduler();
//IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
IJobDetail job = JobBuilder.Create<T>().Build();
if (map != null)
{
foreach (var item in map)
{
job.JobDataMap.Add(item);
}
}
ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).WithRepeatCount(times))
.Build();
_listsche.Add(scheduler);
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
}
/// <summary>
/// 每隔 minutes分钟 ,重复执行times次 (如:times=-1重复执行;times=0只执行一次; )
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="minutes"></param>
/// <param name="times"></param>
public static void ExecuteIntervalMinutesTime<T>(int minutes, int times) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = (IScheduler)factory.GetScheduler();
IJobDetail job = JobBuilder.Create<T>().Build();
ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInMinutes(minutes).WithRepeatCount(times))
.Build();
_listsche.Add(scheduler);
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
}
/// <summary>
/// 每隔 hours小时 ,重复执行times次 (如:times=-1重复执行;times=0只执行一次; )
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="hours"></param>
/// <param name="times"></param>
public static void ExecuteIntervalHoursTime<T>(int hours, int times) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = (IScheduler)factory.GetScheduler();
IJobDetail job = JobBuilder.Create<T>().Build();
ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInHours(hours).WithRepeatCount(times))
.Build();
_listsche.Add(scheduler);
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
}
/// <summary>
/// 每天hours点minute分执行
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="hours">小时</param>
/// <param name="times">分钟</param>
public static void ExecuteIntervalDailyTime<T>(int hours, int minute) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = (IScheduler)factory.GetScheduler();
IJobDetail job = JobBuilder.Create<T>().Build();
ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(hours, minute))
.Build();
_listsche.Add(scheduler);
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
}
/// <summary>
/// 关闭所有工厂调度任务
/// </summary>
public static void ShutdownJobs()
{
try
{
if (_listsche.Count > 0)
{
foreach (var sched in _listsche)
{
if (!sched.IsShutdown)
{
// logclass.Info(string.Format("关闭任务调度:{0}", sched.SchedulerName));
sched.Shutdown();
}
}
_listsche.Clear();
}
}
catch (Exception e)
{
//logclass.Error(string.Format("关闭任务调度,出错:{0}", e), e);
}
}
}
public class QuartzManager<T> where T : class, IJob
{
#region 变量
private static ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); //scheduler工厂
private static String JOB_GROUP_NAME = "JOBGROUP_NAME"; //Job群组名
private static String TRIGGER_GROUP_NAME = "TRIGGERGROUP_NAME"; //触发器群组名
#endregion
#region 添加,删除,修改Job方法
/// <summary>
/// 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
/// </summary>
/// <param name="pStrJobName">任务名</param>
/// <param name="pStrCronExpress">触发器表达式</param>
public static void addJob(string pStrJobName, string pStrCronExpress, IDictionary<string, object> pDictionary)
{
try
{
IScheduler sched = (IScheduler)schedulerFactory.GetScheduler();
// 创建任务
IJobDetail job = JobBuilder.Create<T>()
.WithIdentity(pStrJobName, JOB_GROUP_NAME)
.Build();
// 创建触发器
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(pStrJobName, TRIGGER_GROUP_NAME)
.WithCronSchedule(pStrCronExpress)
.Build();
//给任务传参数
foreach (KeyValuePair<string, object> kvp in pDictionary)
{
job.JobDataMap.Put(kvp.Key, kvp.Value);
}
sched.ScheduleJob(job, trigger);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
/// </summary>
/// <param name="pStrJobName">任务名称</param>
public static void RemoveJob(string pStrJobName)
{
try
{
IScheduler sched = (IScheduler)schedulerFactory.GetScheduler();
JobKey jobKey = new JobKey(pStrJobName);
TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME);
sched.PauseTrigger(triggerKey);// 停止触发器
sched.UnscheduleJob(triggerKey);// 移除触发器
sched.DeleteJob(jobKey);// 删除任务
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
/// </summary>
/// <param name="pStrJobName">任务名</param>
/// <param name="pStrCronExpress">触发器表达式</param>
public static void ModifyJobTime(string pStrJobName, string pStrCronExpress, IDictionary<string, object> pDictionary)
{
try
{
IScheduler sched = (IScheduler)schedulerFactory.GetScheduler();
TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME);
ICronTrigger trigger = (ICronTrigger)sched.GetTrigger(triggerKey);
if (trigger == null)
{
return;
}
RemoveJob(pStrJobName);
addJob(pStrJobName, pStrCronExpress, pDictionary);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
#endregion
#region 启动,关闭Job
/// <summary>
/// 启动所有定时任务
/// </summary>
public static void startJobs()
{
try
{
IScheduler sched = (IScheduler)schedulerFactory.GetScheduler();
sched.Start();
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// 关闭所有定时任务
/// </summary>
public static void ShutdownJobs()
{
try
{
IScheduler sched = (IScheduler)schedulerFactory.GetScheduler();
if (!sched.IsShutdown)
{
sched.Shutdown();
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
#endregion
}
- 创建任务类:例
public class MyJob : IJob
{
ILog logger = LogsHelper.GetCustomLogger("MyJob", "QSH");
public void Execute(IJobExecutionContext context)
{
logger.Info("开始");
logger.Info($"JobDetail的组和名字:{context.JobDetail.Key}");
logger.Info("结束");
}
}
- 执行全部任务类
public static class JobConfig
{
public static void JobContent()
{
var _jobStatus = System.Configuration.ConfigurationManager.AppSettings["JobStatus"];
if (_jobStatus == "Y")
{
QuartzHelper.ExecuteIntervalMinutesTime<MyJob >(30,-1 );
}
}
}
- 调用任务
JobConfig.JobContent();