使用xml配置Quartz任務調度程序
1、Nuget
Install-Package Quartz Install-Package Quartz.Plugins
2、站點根目錄下加入文件quartz.config、quartz_jobs.xml,(注意需要設置“復制到輸出目錄”為始終復制)文件名稱默認:
quartz.config:
# You can configure your scheduler in either <quartz> configuration section # or in quartz properties file # Configuration section has precedence quartz.scheduler.instanceName = ServerScheduler # 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.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins quartz.plugin.xml.fileNames = ~/quartz_jobs.xml
quartz_jobs.xml:
<?xml version="1.0" encoding="UTF-8"?> <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> <processing-directives> <overwrite-existing-data>true</overwrite-existing-data> </processing-directives> <schedule> <job> <name>TestJob</name> <group>DefaultJobGroup</group> <description>任務描述</description> <job-type>TestQuartzService.TestJob,TestQuartzService</job-type> <durable>true</durable> <recover>false</recover> </job> <trigger> <cron> <name>TestTrigger</name> <group>DefaultJobTriggerGroup</group> <job-name>TestJob</job-name> <job-group>DefaultJobGroup</job-group> <misfire-instruction>DoNothing</misfire-instruction> <cron-expression>*/5 * * * * ?</cron-expression> </cron> </trigger> </schedule> </job-scheduling-data>
3、創建QuartzFactory.cs,名稱自定義:
public static void Start() { StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = factory.GetScheduler().Result; Schedulers.Add(scheduler); scheduler.Start(); }
4、最后定義業務job,實現IJob接口
public class TestJob : IJob { public Task Execute(IJobExecutionContext context) { return Task.Run(() => { //業務操作 }); } }
在IJob實現類中實現構造函數的參數注入
1、實現IJobFactory接口
/// <summary> /// 任務調度工廠實現,為了調用作業的參數構造函數,Quartz.NET提供了IJobFactory接口 /// </summary> public class DemoFactory : IJobFactory { private readonly IServiceProvider _serviceProvider; public DemoFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) { var jobDetail = bundle.JobDetail; var job = (IJob)_serviceProvider.GetService(jobDetail.JobType); return job; } public void ReturnJob(IJob job) { var disposable = job as IDisposable; disposable?.Dispose(); } }
2、通過IServiceCollection注冊IJob實現類
var listServices = ReflectorHelper.GetTClassName("IJob實現類所在的程序集名稱"); //ReflectorHelper 為程序集反射工具類 foreach (var item in listServices) {
services.AddScoped(item);
}
3、使用實現的工廠,為了調用作業的參數構造函數
Start中設置:
scheduler.JobFactory = new DemoFactory(services.BuildServiceProvider());
4、Startup中啟動:
QuartzFactory.Start();