开发平台:
VS2019
背景:
在开发小程序的API服务的时候,由于access_token的有效期为7200秒,也就是2小时,这就需要后端定时的去更新这个access_token,便于调用小程序的一些接口。
设计思路与实现步骤:
1.准备把access_token存在数据库中,如前端需要调小程序接口,通过我的后端去调小程序公开的接口。
2.我的webapi部署在IIS上,所以在Global.asax启动站点的时候,在Application_Start方法下添加我的定时任务。如下图
3.RunScheduler方法内Quartz.Net来创建任务调度器、创建作业和触发器等。
在VS中用NuGet管理器下载Quartz.Net并添加到指定的项目中去,如下图,我这里用的是VS2019
AccessTokenJobSchedule.RunScheduler()代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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类代码如下
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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了