WebAPI项目添加定时服务

开发平台:

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()代码如下:

 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         }
View Code

上述代码中创建作业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 }
View Code

------------------------------------------------------------------------------------------------------------以上代码基本实现

测试

在IIS中启动我的Global.asax,触发我的定时服务

 

查看数据库日志,我设定的是每10分钟执行我的操作

 事实没那么简单

这是什么原因呢,原来是IIS这个东东自动回收了我的进程,觉得我这个进程不是活跃的。

解决办法是配置你使用到的程序池配置,在程序池的高级设置中:

启动模式:AlwaysRunning

固定时间间隔(分钟):0

闲置超时(分钟):0

现在去重启我的页面测试,就OK了

 

posted @ 2019-06-19 14:49  Evan_Zhang  阅读(1602)  评论(0编辑  收藏  举报