前言:
? ?在上一章 <https://i3yuan.cnblogs.com/p/11332931.html>
中,我們通過利用控制臺實現(xiàn)定時任務(wù)調(diào)度,已經(jīng)大致了解了如何基于Quartz.Net組件實現(xiàn)任務(wù),至少包括三部分:job(作業(yè)),trigger(觸發(fā)器),scheduler(調(diào)度器)。其中job是需要在一個定時任務(wù)中具體執(zhí)行的業(yè)務(wù)邏輯,trigger通過規(guī)定job何時并按照何種指定的規(guī)則進(jìn)行執(zhí)行,最后job和trigger會被注冊到scheduler中,利用scheduler(調(diào)度器)來負(fù)責(zé)協(xié)調(diào)job和trigger的搭配運行。
? 你是否在工作中會遇到需要軟件具有自動執(zhí)行任務(wù)的功能,但是又不希望直接啟動軟件來手動執(zhí)行任務(wù)??
? ? ? ? ? ? ? ? ? ? ? ? ?
? 這個時候,我們可以考慮用到window服務(wù),基于Quartz.Net組件定時輪詢數(shù)據(jù)庫同步,定時郵件通知,定時處理數(shù)據(jù)等功能。
開始:
首先創(chuàng)建一個windows服務(wù)項目
在創(chuàng)建好的項目中,Service1.cs文件中點擊“單擊此處切換到代碼視圖”切換到代碼
這個時候我們可以注意到兩個方法:OnStart? (服務(wù)啟動)和?OnStop(服務(wù)停止)
/// <summary> /// 服務(wù)啟動 /// </summary> /// <param name="args"></param> protected
override void OnStart(string[] args) { } /// <summary> /// 服務(wù)停止 /// </summary>
protected override void OnStop() { }
一、創(chuàng)建一個scheduler的引用:
ISchedulerFactory schedFact = new StdSchedulerFactory(); IScheduler sched =
await schedFact.GetScheduler();
二、啟動 scheduler:
await sched.Start();
三、實現(xiàn)IJob:
SyncJob.cs 實現(xiàn)IJob,在Execute方法里編寫要處理的業(yè)務(wù)邏輯,系統(tǒng)就會按照Quartz的配置,定時處理
[Invoke(Name = "SyncJob", Remark = "Quartz服務(wù)", Group = "Quartz服務(wù)管理", Begin = "
2018-05-01 12:00:00", Interval = 5)] public class SyncJob : IJob { public Task
Execute(IJobExecutionContext context) {try { //每次執(zhí)行 獲取當(dāng)前時間 輸出當(dāng)前時間 //
可以在這里編寫每次定時執(zhí)行需要的方法 LogHelper.SaveLog("輸出日志", "在當(dāng)前時間:" + DateTime.Now + "
--上一次執(zhí)行時間:" + DateTime.Now.AddSeconds(-5)); } catch (Exception ex) {
LogHelper.SaveLog(ex); }return null; } }
四、創(chuàng)建trigger:(建立一個某個時間點的觸發(fā)器,并且每5秒執(zhí)行一次)
ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1")
//觸發(fā)器 組 .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
.Build();
五、觸發(fā)器執(zhí)行任務(wù):
await sched.ScheduleJob(job, trigger);
將幾個步驟整合后代碼如下:
/// <summary> /// 服務(wù)啟動 /// </summary> /// <param name="args"></param>
protected override void OnStart(string[] args) {
Run().GetAwaiter().GetResult(); LogHelper.SaveLog("服務(wù)", "開始"); } /// <summary>
/// 服務(wù)停止 /// </summary> protected override void OnStop() { try { if (scheduler
!=null) { scheduler.Shutdown(); } } catch (Exception ex) {
LogHelper.SaveLog(ex); } LogHelper.SaveLog("服務(wù)", "結(jié)束"); } IScheduler scheduler;
private async Task Run() { try { NameValueCollection props = new
NameValueCollection { {"quartz.serializer.type", "binary" } };
StdSchedulerFactory factory= new StdSchedulerFactory(props); scheduler = await
factory.GetScheduler();await scheduler.Start(); Jobs.Jobs.Config(scheduler); }
catch (SchedulerException ex) { LogHelper.SaveLog(ex); } }
安裝
以管理員的身份打開cmd
?
運行:
間隔5秒執(zhí)行一次后的效果:
通過日志的方式輸出數(shù)據(jù),查看效果
附加:
?一、刪除服務(wù)
以管理員的身份打開cmd
?
二、調(diào)試window服務(wù)
1)安裝并運行服務(wù)
?
2)附加進(jìn)程
3)在代碼中加入斷點進(jìn)行調(diào)試
總結(jié):
1.當(dāng)我們在需要用到定時執(zhí)行任務(wù)的時候,可以考慮使用通過window服務(wù)加上quartz組件結(jié)合的方式,實現(xiàn)對任務(wù)的定時執(zhí)行,這也是在很多場景中可以實現(xiàn)的方法,比如:定時輪詢數(shù)據(jù)庫同步,定時郵件通知,定時處理數(shù)據(jù)等
2.通過管理工具顯示當(dāng)前執(zhí)行的任務(wù)和執(zhí)行情況,也利用調(diào)試工具調(diào)試Window服務(wù)中遇到的問題。
3.quartz還有更多的用法,可以參考資料:Quartz.Net官方文檔 <https://www.quartz-scheduler.net/>? ?和??
Quartz.Net開源地址 <https://github.com/quartznet/quartznet>
4.搜索關(guān)注公眾號【雜學(xué)谷】--回復(fù)【定時服務(wù)】,可獲取源碼下載地址內(nèi)容
熱門工具 換一換
感谢您访问我们的网站,您可能还对以下资源感兴趣:
调教肉文小说-国产成本人片免费av-空姐av种子无码-在线观看免费午夜视频-综合久久精品激情-国产成人丝袜视频在线观看软件-大芭区三区四区无码-啊啊好爽啊啊插啊用力啊啊-wanch视频网-国产精品成人a免费观看