近来使用Quartz.net来实现定时作业调度,现记录一下使用流程。
关于Quartz的介绍和详细说明,请访问官网https://www.quartz-scheduler.net/
一、Quartz.net中主要有以下几个对象
1.StdSchedulerFactory(调度器工厂)用于创建调度
2.IScheduler (调度器)用于绑定任务和触发器进行工作
3.IJobDetail(任务)用于执行业务工作
4.ITrigger(触发器)用于指定在特定条件下执行任务
二、安装Quartz.AspNetCore包
三、Quartz.net实现作业调度有两种方式,配置文档方式和不用配置文档方式,以下将分别演示。
1.不用配置文档方式:
如果你的作业项目比较简单,一般只有一个任务或者一两个触发器,且以后不会改变触发策略或者添加任务,那么只需要几行代码来使用Quartz就好了。
public static void Main(string[] args)
{
//任务,JobBLL即你的任务类
IJobDetail jobDetail = JobBuilder.Create().WithIdentity("MyJob").Build();
//cron时间策略
ITrigger trigger = TriggerBuilder.Create().WithIdentity("Mytrigger").WithCronSchedule(CommonBLL.Config["system:cron"]).Build();
//执行一次策略
ITrigger nowTrigger = TriggerBuilder.Create().WithIdentity("now").StartNow().Build();
//简单策略,每3秒执行一次,一共执行两次
//ITrigger trigger = TriggerBuilder.Create().WithSimpleSchedule(s => s.WithIntervalInSeconds(3).WithRepeatCount(2)).Build();
//启动调度
StdSchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = await factory.GetScheduler();
//await scheduler.ScheduleJob(jobDetail, trigger);
//绑定job和trigger,将任务与触发器添加到调度器中
await scheduler.ScheduleJob(jobDetail, new List() { trigger, nowTrigger }, replace: true);//多个trigger,立即执行&&按照既定cron时间策略
//scheduler.ListenerManager.AddJobListener(new TestJobListener());//添加任务执行监控
await scheduler.Start();//开启调度
}
[DisallowConcurrentExecution]//禁止同时执行任务
public class MyJob:IJob
{
//实现Execute方法
public Task Execute(IJobExecutionContext context)
{
return Task.Run(() =>
{
Console.WriteLine("begin....");
//你的作业部分
Thread.Sleep(3000);
Console.WriteLine("end...");
});
}
}
其中,IJob的实现比较简单,将业务代码放在Job中的Execute方法中。
Trigger分为简单触发器和Cron方式,简单触发器一般指立即执行,或者每隔指定时间来执行这样的;Cron方式指可以使用Cron表达式来规定触发时间;Cron表达式的构建可以在网上找工具来构造:https://cron.qqe2.com/
2.配置文档方式
配置文档方式就是通过在配置文件中配置trigger和绑定策略方式,这样可以实现灵活配置;
(1)新增配置文件quartz.config
# You can configure your scheduler in eitherconfiguration section # or in quartz properties file # Configuration section has precedence quartz.scheduler.instanceName = QuartzTest # configure thread pool info quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz quartz.threadPool.threadCount = 10 quartz.threadPool.threadPriority = Normal # job initialization plugin handles our xml reading, without it defaults are used # quartz.plugin.triggHistory.type = Quartz.Plugin.History.LoggingJobHistoryPlugin quartz.plugin.jobInitializer.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins #配置文档路径 quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml # export this server to remoting context #quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz #quartz.scheduler.exporter.port = 555 #quartz.scheduler.exporter.bindName = QuartzScheduler #quartz.scheduler.exporter.channelType = tcp #quartz.scheduler.exporter.channelName = httpQuartz
其中主要是quartz.plugin.jobInitializer.fileNames这个属性是接下来的配置文件的路径,此外将该配置文件复制到输出目录设置为“始终复制”或者“较新赋值”,这样才可以生成到debug或release中。
(2)添加配置文件quartz_jobs.xml
true MyJob MyJob测试任务 QuartzConsole.MyJob, QuartzConsole HisJob HisJob测试任务 QuartzConsole.HisJob, QuartzConsole simpleTrigger TestTrigger测试触发器 MyJob -1 3000 cronTrigger TestTrigger1测试触发器 MyJob 0/2 * * * * ? cronTrigger1 TestTrigger1测试触发器 HisJob 0/1 * * * * ?
按照这样的配置节进行配置,其中
(3)开启调度即可
static void Main(string[] args)
{
//调度
StdSchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = await factory.GetScheduler();
await scheduler.Start();//开启调度
}
这样在调度开启时候,调度自己去配置文件中检测任务及触发器;后续如果添加修改job或者trigger时候,就可以在配置文件中进行操作即可。
完,更多功能等用到再叙



