作業(yè)調(diào)度框架Quartz.NET-現(xiàn)學(xué)現(xiàn)用-01-快速入門(mén)

前言

你需要應(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)

Thanks

Quartz.NET

張善友的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末带膜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸳谜,更是在濱河造成了極大的恐慌膝藕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咐扭,死亡現(xiàn)場(chǎng)離奇詭異芭挽,居然都是意外死亡滑废,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)览绿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)策严,“玉大人,你說(shuō)我怎么就攤上這事饿敲∑薜迹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵怀各,是天一觀的道長(zhǎng)倔韭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瓢对,這世上最難降的妖魔是什么寿酌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮硕蛹,結(jié)果婚禮上醇疼,老公的妹妹穿的比我還像新娘。我一直安慰自己法焰,他們只是感情好秧荆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著埃仪,像睡著了一般乙濒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卵蛉,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天颁股,我揣著相機(jī)與錄音,去河邊找鬼傻丝。 笑死甘有,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的葡缰。 我是一名探鬼主播梧疲,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼运准!你這毒婦竟也來(lái)了幌氮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胁澳,失蹤者是張志新(化名)和其女友劉穎该互,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體韭畸,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宇智,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蔓搞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片随橘。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喂分,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出机蔗,到底是詐尸還是另有隱情蒲祈,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布萝嘁,位于F島的核電站梆掸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏牙言。R本人自食惡果不足惜酸钦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咱枉。 院中可真熱鬧卑硫,春花似錦、人聲如沸蚕断。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)基括。三九已至,卻和暖如春财岔,著一層夾襖步出監(jiān)牢的瞬間风皿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工匠璧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桐款,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓夷恍,卻偏偏與公主長(zhǎng)得像魔眨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酿雪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345