前言
你需要應(yīng)用執(zhí)行一個(gè)任務(wù)嗎?這個(gè)任務(wù)每天或每周星期二晚上11:30,或許僅僅每個(gè)月的最后一天執(zhí)行。一個(gè)自動(dòng)執(zhí)行而無(wú)須干預(yù)的任務(wù)在執(zhí)行過(guò)程中如果發(fā)生一個(gè)嚴(yán)重錯(cuò)誤撞芍,應(yīng)用能夠知到其執(zhí)行失敗并嘗試重新執(zhí)行嗎?你和你的團(tuán)隊(duì)是用.NET編程嗎跨扮?如果這些問(wèn)題中任何一個(gè)你回答是序无,那么你應(yīng)該使用Quartz.NET調(diào)度器验毡。 Quartz.NET允許開(kāi)發(fā)人員根據(jù)時(shí)間間隔(或天)來(lái)調(diào)度作業(yè)。它實(shí)現(xiàn)了作業(yè)和觸發(fā)器的多對(duì)多關(guān)系帝嗡,還能把多個(gè)作業(yè)與不同的觸發(fā)器關(guān)聯(lián)晶通。整合了 Quartz.NET的應(yīng)用程序可以重用來(lái)自不同事件的作業(yè),還可以為一個(gè)事件組合多個(gè)作業(yè)哟玷。
Quartz.NET 簡(jiǎn)介
Quartz.NET是一個(gè)用C#編寫(xiě)的基于.NetCore的純.Net庫(kù)狮辽,是一個(gè)非常流行的開(kāi)源Java作業(yè)調(diào)度框架Quartz的.Net版本。這個(gè)項(xiàng)目很大程度上歸功于原始的Java項(xiàng)目巢寡。此項(xiàng)目已更新到3.0+版本喉脖,也是博主學(xué)習(xí)使用的版本。官方文檔抑月。
Quartz.NET 快速入門(mén)
Quartz.NET 關(guān)鍵接口和類
- IScheduler : - 與調(diào)度程序交互的主要API动看。
- IJob - 由您希望由調(diào)度程序執(zhí)行的組件實(shí)現(xiàn)的接口。
- IJobDetail - 用于定義Jobs的實(shí)例爪幻。
- ITrigger - 一個(gè)觸發(fā)器,用于定義執(zhí)行給定作業(yè)的計(jì)劃须误。
- JobBuilder - 用于定義/構(gòu)建JobDetail實(shí)例挨稿,用于定義Jobs的實(shí)例。
- TriggerBuilder - 用于定義/構(gòu)建觸發(fā)器實(shí)例京痢。
示例應(yīng)用程序
using Quartz;
using Quartz.Impl;
using System;
namespace MGToastServer
{
class Program
{
static void Main(string[] args)
{
StartUpJobs.StartUp().GetAwaiter().GetResult();
Console.ReadKey();
}
}
public static class StartUpJobs
{
public static async Task StartUp()
{
try
{
//第一步:從工廠中獲取Scheduler實(shí)例
NameValueCollection props = new NameValueCollection();
StdSchedulerFactory factory = new StdSchedulerFactory(props);
IScheduler scheduler = await factory.GetScheduler();
//第二步:然后運(yùn)行它
await scheduler.Start();
//第三步:定義作業(yè)并綁定到HelloJob類奶甘,HelloJob類繼承IJob接口
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "group1")
//UsingJobData 可以用來(lái)傳參數(shù)
.UsingJobData("appKey", "123456QWE")
.UsingJobData("appName", "小熊貓")
.UsingJobData("api", "https://www.baidu.com")
.Build();
//第四步:創(chuàng)建觸發(fā)器。設(shè)定祭椰,每十秒執(zhí)行一次作業(yè)臭家。永遠(yuǎn)重復(fù)。
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1") //指定唯一標(biāo)識(shí)方淤,觸發(fā)器名字钉赁,和組名字
//這對(duì)于將作業(yè)和觸發(fā)器組織成“報(bào)告作業(yè)”和“維護(hù)作業(yè)”等類別非常有用。
//作業(yè)或觸發(fā)器的鍵的名稱部分在組內(nèi)必須是唯一的
.StartNow() //從現(xiàn)在開(kāi)始執(zhí)行
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10) //每十秒執(zhí)行一次
.RepeatForever()) //永遠(yuǎn)重復(fù)
.Build();
//第五步:作業(yè)與觸發(fā)器組合携茂,安排任務(wù)
await scheduler.ScheduleJob(job, trigger);
//可以設(shè)置關(guān)閉該調(diào)度
//await Task.Delay(TimeSpan.FromSeconds(5));
//await scheduler.Shutdown();
}
catch (SchedulerException se)
{
Console.WriteLine(se);
}
}
}
public class HelloJob : IJob
{
private string appKey;
private string appName;
private string appApi;
public async Task Execute(IJobExecutionContext context)
{
JobKey jkey = context.JobDetail.Key;
TriggerKey tKey = context.Trigger.Key;
JobDataMap dataMap = context.MergedJobDataMap;
appKey = dataMap.GetString("appKey"); //通過(guò)鍵值獲取數(shù)據(jù)
appName = dataMap.GetString("appName");
appApi = dataMap.GetString("api");
await Console.Error.WriteLineAsync("[" + DateTime.Now.ToLongTimeString() + "]" + "開(kāi)始推送:\n" + "JobKey:" + jkey + "\nTriggerKey:" + tKey + "\nAppKey:" + appKey + " appName: " + appName + ", and AppAPI: " + appApi);
}
}
}
實(shí)驗(yàn)效果
如截圖所示你踩,每十秒執(zhí)行一次任務(wù)。并且可以接收到傳入的參數(shù)讳苦。
下篇
下篇:作業(yè)調(diào)度框架Quartz.NET-02-任務(wù)監(jiān)聽(tīng)