LindAgile.SchedulingTask~設(she)計一(yi)個不錯的任(ren)務調度組件
SchedulingTask產生的原因
任務調試主要(yao)指定期(qi)執行某些任務代(dai)碼,之前用(yong)過(guo)quartz,感(gan)覺有(you)些重,使用(yong)時需要(yao)添加包包,配置管理項時,對于簡(jian)單(dan)的(de)(de)項目用(yong)它就顯得有(you)些臃腫了(le)(le),不如直接上個簡(jian)單(dan)的(de)(de)東西來(lai)實現(xian),所有(you)才(cai)有(you)了(le)(le)今天的(de)(de)SchedulingTask,它被(bei)大叔集成到了(le)(le)最新的(de)(de)lindAgile框(kuang)架里,也是Modules的(de)(de)一個子單(dan)元,在項目啟動時由ModuleManager統(tong)一完成注冊!
SchedulingTask核心的設計圖
SchedulingTask的注冊
ModuleManager.Create()
.UseDefaultContainer()
.UseLogger()
.UseMockRepository()
.UseDefaultMq();
而對于我們每(mei)個Job任(ren)務(wu),需要開發人(ren)員根據(ju)業務(wu)要求去編(bian)寫,它們將(jiang)繼承一個叫ScheduleBase的(de)(de)抽象類,此類為我們提供(gong)了調度周期,任(ren)務(wu)執行(xing)器(qi)等核心的(de)(de)邏輯!
/// <summary> /// 啟動任務 /// </summary> /// <param name="name"></param> /// <param name="action"></param> /// <param name="dueTime">執行方法前(qian)的(de)延時時間,毫秒</param> /// <param name="interval">執行方法的時間間隔,毫秒(miao)</param> public void StartTask(string name, int interval) { lock (_lockObject) { if (_taskDict.ContainsKey(name)) return; var timer = new Timer(TaskCallback, name, Timeout.Infinite, Timeout.Infinite); _taskDict.Add(name, new TimerTaskModel { Name = name, Callback = Excute, Timer = timer, IntervalMillisecond = interval, Stopped = false }); timer.Change(interval, 0); } }
而它與其它具體JOB的關系,我們可以用一(yi)張圖來表示
對于任務的啟動,我們由ScheduleFactory來完成,它會將當前運行時下所有繼(ji)承ScheduleBase的Job類(lei)都加載到容器里,通過自己的調試周(zhou)期去定(ding)時執(zhi)行!
/// <summary> /// 開始任(ren)務q /// 裝置(zhi)所有任務,并啟動(dong)它的StartTask()方(fang)法 /// </summary> public void Run() { foreach (var item in GetAllTypes()) { var obj = Activator.CreateInstance(item, true); MethodInfo methodinfo = item.GetMethod("StartTask"); _iLogger.Logger_Info(string.Format("{0}這個Job開始(shi)執行", item.Name)); methodinfo.Invoke(obj, new object[] { item.Name, _intervalMillisecond > 0 ? _intervalMillisecond : item.GetProperty("IntervalMillisecond").GetValue(obj) }); } }
而對于使用者(zhe)來(lai)說,要做的(de)就是(shi)建(jian)立自己的(de)業務Job和在程序入口添加對Run的(de)使用即可
#region TaskJob sf.UseLogger().Run(); Console.ReadKey(); #endregion
結果如圖
希望(wang)各位繼續支持(chi)微軟,支持(chi)咱們自(zi)己的.net技術!
謝謝!