Docker是一个功能齐全的开源做业调度系统,能够与几乎任何其余软件系统集成或一块儿使用。express
.NET Framework经过System.Timers.Timer类具备“内置”计时器功能-为何有人使用Quartz而不是这些标准功能?async
缘由有不少!这里有一些:工具
首先,安装Quartz测试
Quartz
而后,定义一个任务类ui
using System; using System.Threading.Tasks; namespace Quartz.ConsoleApp01 { public class HelloJob : IJob { public Task Execute(IJobExecutionContext context) { Console.WriteLine("Hello "+DateTime.Now); return Task.CompletedTask; } } }
最后,实例化并启动调度程序,并调度要执行的做业:this
using Quartz.Impl; using System; using System.Threading.Tasks; namespace Quartz.ConsoleApp01 { class Program { static async Task Main(string[] args) { Console.WriteLine("开始调度!"); //一、建立一个调度 var factory = new StdSchedulerFactory(); var scheduler = await factory.GetScheduler(); await scheduler.Start(); //二、建立一个任务 var job = JobBuilder.Create<HelloJob>() .WithIdentity("job1", "group1") .Build(); //三、建立一个触发器 var trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0/5 * * * * ?") //5秒执行一次 .Build(); await scheduler.ScheduleJob(job, trigger); Console.ReadKey(); } } }
咱们来看一下输出结果:spa
开始调度! Hello 2021/1/19 14:37:40 Hello 2021/1/19 14:37:45 Hello 2021/1/19 14:37:50 Hello 2021/1/19 14:37:55
首先,安装Quartz,Quartz.Plugins.net
Quartz Quartz.Plugins
而后,定义一个任务类线程
using System; using System.Threading.Tasks; namespace Quartz.ConsoleApp02 { public class HelloJob : IJob { public Task Execute(IJobExecutionContext context) { Console.WriteLine("Hello " + DateTime.Now); return Task.CompletedTask; } } }
接着,配置quartz_jobs.xml文件code
<?xml version="1.0" encoding="UTF-8"?> <!-- This file contains job definitions in schema version 2.0 format --> <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> <!--TestJob测试 任务配置--> <job> <name>job1</name> <group>group1</group> <description>job1</description> <job-type>Quartz.ConsoleApp02.HelloJob,Quartz.ConsoleApp02</job-type> <durable>true</durable> <recover>false</recover> </job> <trigger> <cron> <name>trigger1</name> <group>group1</group> <job-name>job1</job-name> <job-group>group1</job-group> <cron-expression>0/5 * * * * ?</cron-expression> </cron> </trigger> </schedule> </job-scheduling-data>
最后,实例化并启动调度程序:
using Quartz.Impl; using System; using System.Collections.Specialized; using System.Threading.Tasks; namespace Quartz.ConsoleApp02 { class Program { static async Task Main(string[] args) { Console.WriteLine("开始调度!"); //一、首先,咱们必须得到对调度程序的引用 var properties = new NameValueCollection { ["quartz.scheduler.instanceName"] = "XmlConfiguredInstance", ["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz", ["quartz.threadPool.threadCount"] = "5", ["quartz.plugin.xml.type"] = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins", ["quartz.plugin.xml.fileNames"] = "~/quartz_jobs.xml", // this is the default ["quartz.plugin.xml.FailOnFileNotFound"] = "true", // this is not the default ["quartz.plugin.xml.failOnSchedulingError"] = "true" }; //二、建立一个调度 var factory = new StdSchedulerFactory(properties); var scheduler = await factory.GetScheduler(); await scheduler.Start(); Console.ReadKey(); } } }
cron是已存在很长时间的UNIX工具,所以其调度功能强大且通过验证。
cron表达式是由7段构成:秒 分 时 日 月 星期 年(可选)
表达 | 含义 |
---|---|
0 0 12 * * ? | 天天中午12点(中午)触发 |
0 15 10 ? * * | 天天上午10:15触发 |
0 15 10 * * ? | 天天上午10:15触发 |
0 15 10 * * ? * | 天天上午10:15触发 |
0 15 10 * * ? 2005 | 2005年期间,天天上午10:15触发 |
0 * 14 * * ? | 天天从下午2点开始,直到下午2:59结束,每分钟触发一次 |
0 0/5 14 * * ? | 天天从下午2点开始,直到下午2:55,每5分钟触发一次 |
0 0/5 14,18 * * ? | 天天从下午2点开始到下午2:55结束,每5分钟触发一次,而且天天下午6点开始到下午6:55结束,每5分钟触发一次 |
0 0-5 14 * * ? | 天天从下午2点开始,直到下午2:05结束,每分钟触发一次 |
0 10,44 14 ? 3 WED | 3月的每一个星期三下午2:10和2:44 pm触发。 |
0 15 10 ? * MON-FRI | 每一个星期一,星期二,星期三,星期四和星期五的上午10:15触发 |
0 15 10 15 * ? | 每月的15日上午10:15触发 |
0 15 10 L * ? | 每月的最后一天上午10:15触发 |
0 15 10 L-2 * ? | 每月的倒数第二个上午10:15触发 |
0 15 10 ? * 6L | 每月的最后一个星期五上午10:15触发 |
0 15 10 ? * 6L | 每月的最后一个星期五上午10:15触发 |
0 15 10 ? * 6L 2002-2005 | 在200二、200三、2004和2005年的每月的最后一个星期五上午10:15触发 |
0 15 10 ? * 6#3 | 每月的第三个星期五上午10:15触发 |
0 0 12 1/5 * ? | 从每个月的第一天开始,每个月每5天在中午12点(中午)触发。 |
0 11 11 11 11 ? | 每一年11月11日上午11:11触发。 |