開發平臺:前端
VS2019web
背景:數據庫
在開發小程序的API服務的時候,因爲access_token的有效期爲7200秒,也就是2小時,這就須要後端定時的去更新這個access_token,便於調用小程序的一些接口。小程序
設計思路與實現步驟:後端
1.準備把access_token存在數據庫中,如前端須要調小程序接口,經過個人後端去調小程序公開的接口。api
2.個人webapi部署在IIS上,因此在Global.asax啓動站點的時候,在Application_Start方法下添加個人定時任務。以下圖async
3.RunScheduler方法內Quartz.Net來建立任務調度器、建立做業和觸發器等。ide
在VS中用NuGet管理器下載Quartz.Net並添加到指定的項目中去,以下圖,我這裏用的是VS2019測試
AccessTokenJobSchedule.RunScheduler()代碼以下:ui
1 public class AccessTokenJobSchedule 2 { 3 public static async Task RunScheduler() 4 { 5 // 建立做業調度器 6 ISchedulerFactory factory = new StdSchedulerFactory(); 7 IScheduler scheduler = await factory.GetScheduler(); 8 9 // 啓動調度器 10 await scheduler.Start(); 11 12 // 建立做業 13 IJobDetail job = JobBuilder.Create<UpdateAccessTokenJob>() 14 .WithIdentity("job1", "group1") 15 .Build(); 16 17 // 建立觸發器,每10min執行一次 18 ITrigger trigger = TriggerBuilder.Create() 19 .WithIdentity("trigger1", "group1") 20 .StartNow() 21 .WithSimpleSchedule(x => x 22 .WithIntervalInMinutes(10) 23 .RepeatForever()) 24 .Build(); 25 26 // 加入到做業調度器中 27 await scheduler.ScheduleJob(job, trigger); 28 }
上述代碼中建立做業job中,UpdateAccessTokenJob類須要繼承Quzrtz中的接口IJob,實現接口IJob中的方法Execute,在Execute方法中能夠編寫具體的方法,即須要定時去執行的操做。
IJobDetail job = JobBuilder.Create<UpdateAccessTokenJob>().WithIdentity("job1", "group1").Build();
UpdateAccessTokenJob類代碼以下
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Threading.Tasks; 5 using System.Web; 6 using Quartz; 7 using Quartz.Impl; 8 using System.Configuration; 9 10 namespace WebAPI.ExtendFuncs 11 { 12 public class UpdateAccessTokenJob : IJob 13 { 14 public async Task Execute(IJobExecutionContext context) 15 { 16 //本身實現要定時執行的操做方法 17 18 } 19 20 } 21 }
------------------------------------------------------------------------------------------------------------以上代碼基本實現
測試
在IIS中啓動個人Global.asax,觸發個人定時服務
查看數據庫日誌,我設定的是每10分鐘執行個人操做
事實沒那麼簡單
這是什麼緣由呢,原來是IIS這個東東自動回收了個人進程,以爲我這個進程不是活躍的。
解決辦法是配置你使用到的程序池配置,在程序池的高級設置中:
啓動模式:AlwaysRunning
固定時間間隔(分鐘):0
閒置超時(分鐘):0
如今去重啓個人頁面測試,就OK了