Quartz.NET一個優秀的做業調度框架

1 什麼是Quartz.NET?

Docker是一個功能齊全的開源做業調度系統,能夠與幾乎任何其餘軟件系統集成或一塊兒使用。express

2 爲何須要Quartz.NET?

.NET Framework經過System.Timers.Timer類具備「內置」計時器功能-爲何有人使用Quartz而不是這些標準功能?async

緣由有不少!這裏有一些:工具

  • 計時器沒有持久性機制。
  • 計時器的時間安排不靈活(只能設置開始時間和重複間隔,沒有基於日期,一天中的時間等信息)。
  • 計時器不使用線程池(每一個計時器一個線程)
  • 計時器沒有真正的管理方案-您必須編寫本身的機制以可以按名稱記住,組織和恢復任務等。

3 如何使用Quartz.NET?

首先,安裝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

3 使用配置文件方式使用Quartz.NET?

首先,安裝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();
        }
    }
}

4 Cron表達式

4.1 介紹

cron是已存在很長時間的UNIX工具,所以其調度功能強大且通過驗證。
cron表達式是由7段構成:秒 分 時 日 月 星期 年(可選)

  • "*" 用於選擇字段中的全部值,例如,在分鐘字段中表示「每分鐘」。
  • "?" 在須要在容許使用字符的兩個字段之一中指定某些內容而在另外一個不容許使用的字段中指定內容時頗有用。例如,若是我但願觸發器在每個月的某個特定日期(例如10號)觸發,但不在意是星期幾,則將其10輸入「月日」字段,以及?「星期幾」字段中。
  • "-" 用於指定範圍。例如,10-12在小時字段中表示「小時十、11和12」。
  • "," 用於指定其餘值。例如,MON,WED,FRI在「星期幾」字段中表示「星期一,星期三和星期五的日子」。
  • "/" 用於指定增量。例如,0/15在秒字段中表示「秒0、1五、30和45」。和5/15在秒字段的意思是「秒5,20,35和50」。
  • "L" 在容許使用的兩個字段中都有不一樣的含義。例如,「L月日」字段中的值表示「月的最後一天」
  • "W" 用於指定最接近給定日期的工做日(星期一至星期五)。例如,若是您要指定「15W月日」字段的值,則含義是:「離月15日最近的工做日」。
  • "#" 用於指定每個月的「第n個」 XXX天。例如,「6#3星期幾」字段中的值表示「每個月的第三個星期五」(第6天=星期五,「#3」 =每個月的第三個星期五)。

4.2 例子

表達 含義
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觸發。
相關文章
相關標籤/搜索