NET作業(yè)調(diào)度(定時(shí)任務(wù))-Quartz.Net


一. 背景

工作中我們難免會(huì)有這樣一些需求:定時(shí)任務(wù),說(shuō)白了就是在某一時(shí)間,讓我們的程序來(lái)執(zhí)行一些工作.
說(shuō)道這里,也你會(huì)想到windows計(jì)劃任務(wù),但在一些時(shí)候它并沒(méi)有很好的擴(kuò)展性,一些復(fù)雜的任務(wù)并不能很好的完成,不能滿足的我們的工作需要,我們需要的是一個(gè)集群部署的作業(yè)調(diào)度框架间狂。

二. Quartz.Net介紹

Quartz.NET是一個(gè)開(kāi)源的作業(yè)調(diào)度框架,非常適合在平時(shí)的工作中审洞,定時(shí)輪詢數(shù)據(jù)庫(kù)同步,定時(shí)郵件通知调窍,定時(shí)處理數(shù)據(jù)等若锁。 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è).
它一些很好的特性:
1:支持集群,作業(yè)分組崖疤,作業(yè)遠(yuǎn)程管理秘车。
2:自定義精細(xì)的時(shí)間觸發(fā)器,使用簡(jiǎn)單劫哼,作業(yè)和觸發(fā)分離叮趴。
3:數(shù)據(jù)庫(kù)支持,可以寄宿Windows服務(wù)权烧,WebSite眯亦,winform等。

三. 實(shí)戰(zhàn)

利用nuget來(lái)安裝 Quartz.Net
Quartz框架的基礎(chǔ)概念解釋:
Scheduler 作業(yè)調(diào)度器般码。
IJob 作業(yè)接口妻率,繼承并實(shí)現(xiàn)Execute, 編寫執(zhí)行的具體作業(yè)邏輯板祝。
JobBuilder 根據(jù)設(shè)置宫静,生成一個(gè)詳細(xì)作業(yè)信息(JobDetail)。
TriggerBuilder 根據(jù)規(guī)則,生產(chǎn)對(duì)應(yīng)的Trigger

編寫類CronTask.cs 實(shí)現(xiàn)IJob囊嘉,在Execute方法里編寫要處理的業(yè)務(wù)邏輯温技,系統(tǒng)就會(huì)按照Quartz的配置,定時(shí)處理扭粱。

public sealed class CronTask : IJob
{
    private static Logger logger = LogManager.GetCurrentClassLogger();
    public void Execute(IJobExecutionContext context)
    {
        //可以通過(guò)context對(duì)象來(lái)獲取傳遞過(guò)來(lái)的一些數(shù)據(jù)數(shù)據(jù)
        JobDataMap dataMap = context.MergedJobDataMap;
        string tag = dataMap.GetString("tag");
        string title = dataMap.GetString("title");
        string content = dataMap.GetString("content");
        string description = dataMap.GetString("description");
        string tels = dataMap.GetString("tels");
        
        //執(zhí)行定時(shí)任務(wù) 發(fā)送短信
        SendMsg(tels,content);
        
        context.Scheduler.Shutdown();
        logger.InfoFormat("定時(shí)任務(wù)測(cè)試");
    }
    
    //定義任務(wù)
    public static void SetTask(string tag, string starttime, string title, string content, string description,string tels)
    {
        try
        {
            DateTime time = DateTime.Parse(starttime);
            //下面用到的執(zhí)行時(shí)間要使用Cron表達(dá)式(如:"/5 * * ? * *"),下面我會(huì)介紹一下
            string cronstr = GetCron(time);
            //從工廠中獲取一個(gè)調(diào)度器實(shí)例化
            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();
            var jobData = new JobDataMap();
            jobData.Add("tag", tag);
            jobData.Add("title", title);
            jobData.Add("content", content);
            jobData.Add("description", description);
            jobData.Add("tels", tels);
            IJobDetail job = JobBuilder.Create<CronTask>()
                            .WithIdentity("job", DateTime.Now.ToLongDateString())
                            .SetJobData(jobData)
                            .Build();
            ITrigger trigger = TriggerBuilder.Create()
                                        .WithIdentity("msmtriger", "group")
                                        .StartNow()                        //現(xiàn)在開(kāi)始
                                        .WithCronSchedule(cronstr)
                                        .Build();
                                        
            //                  ITrigger trigger2 = TriggerBuilder.Create()
            //                      .WithIdentity("mytrigger", "group1")
            //                      .StartNow()
            //                      .WithCronSchedule("/5 * * ? * *")    //時(shí)間表達(dá)式,5秒一次     
            //                      .Build();                            
                                        
            scheduler.ScheduleJob(job, trigger);//把作業(yè)震檩,觸發(fā)器加入調(diào)度器琢蛤。
        }
        catch (Exception ex)
        {
            logger.Error(ex);
        }
    }
    
    public static string GetCron(DateTime dt)
    {
        string retulut = "";
        retulut = string.Format("0,{0} 0,{1} 0,{2} {3} {4} ? {5}", dt.Second, dt.Minute, dt.Hour, dt.Day, dt.Month, dt.Year);
        return retulut;
    }
    
}

WithCronSchedule("") 擁有強(qiáng)大的Cron時(shí)間表達(dá)式,正常情況下WithSimpleSchedule(x) 已經(jīng)滿足大部分對(duì)日期設(shè)置的要求了抛虏。
上面說(shuō)道的cron表達(dá)式可以參考:
http://www.cnblogs.com/yanweidie/p/3537144.html

里面的在線地址已經(jīng)不能用了,我這里給大家準(zhǔn)備了一個(gè):
Quartz Cron表達(dá)式在線生成器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末博其,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子迂猴,更是在濱河造成了極大的恐慌慕淡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沸毁,死亡現(xiàn)場(chǎng)離奇詭異峰髓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)息尺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門携兵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人搂誉,你說(shuō)我怎么就攤上這事徐紧。” “怎么了炭懊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵并级,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我侮腹,道長(zhǎng)嘲碧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任凯旋,我火速辦了婚禮呀潭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘至非。我一直安慰自己钠署,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布荒椭。 她就那樣靜靜地躺著谐鼎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趣惠。 梳的紋絲不亂的頭發(fā)上狸棍,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天身害,我揣著相機(jī)與錄音,去河邊找鬼草戈。 笑死塌鸯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唐片。 我是一名探鬼主播丙猬,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼费韭!你這毒婦竟也來(lái)了茧球?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤星持,失蹤者是張志新(化名)和其女友劉穎抢埋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體督暂,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揪垄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了损痰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片福侈。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卢未,靈堂內(nèi)的尸體忽然破棺而出肪凛,到底是詐尸還是另有隱情,我是刑警寧澤辽社,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布伟墙,位于F島的核電站,受9級(jí)特大地震影響滴铅,放射性物質(zhì)發(fā)生泄漏戳葵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一汉匙、第九天 我趴在偏房一處隱蔽的房頂上張望拱烁。 院中可真熱鬧,春花似錦噩翠、人聲如沸戏自。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)擅笔。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猛们,已是汗流浹背念脯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弯淘,地道東北人绿店。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像庐橙,于是被迫代替她去往敵國(guó)和親惯吕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容