官网:https://www.quartz-scheduler.net/ 一款开源的任务定时器。
平常有不少地方须要定时刷新的,好比微信开发中的微信API token,或者定时清理一下缓存数据等,应用场景仍是比较常见。
接下来介绍一下这个简单好用的库。redis
在Nuget管理中添加引用: Quartz.dllapi
命名空间:
using Quartz;
using Quartz.Impl;缓存
实现一个task,按时刷新API的token:微信
public async Task RefreshAzulApiTokenJob(IScheduler scheduler) { var tokenJobName = "RefreshAzulToken"; IJobDetail tokenJob = JobBuilder.Create<RefreshAzulTokenJob>() .WithIdentity($"{tokenJobName}Job", $"{tokenJobName}Group") .Build(); ITrigger tokenTrigger = TriggerBuilder.Create() .WithIdentity($"{tokenJobName}Trigger", $"{tokenJobName}Group") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInSeconds(RefreshAzulTokenInterval) .RepeatForever()) .Build(); await scheduler.ScheduleJob(tokenJob, tokenTrigger); }
主要是建立一个Job,这个Job就是一个要定时运行的Task,建立一个Trigger,在Trigger里面自定义设置interval时间。微信开发
1.建立一个类,用来处理这个任务的业务逻辑,好比这个刷新token:async
public class RefreshAzulToken { public static readonly ILogger logger; private static readonly RedisUtils redisUtils; static RefreshAzulToken() { logger = LoggerFactory.GetLogger("RefreshAzulToken", EnvSettings.ElkAddress); redisUtils = ChatbotApiServiceManager.RedisUtils; } public static async Task Excutor() { try { logger.Information(new ApiRequestEvent() { EventType = LogEventType.RefreshAzulTokenStart, Message = $"Start to get api token..." }); var tokenRequestUrl = EnvSettings.AzulTokenUrl; string tokenPostData = "client_id=indigo&client_secret=2lw$IE6GIwsnlUYh&grant_type=client_credentials"; string tokenResponse = await AzulApiClient.AzulHttpClient(true, tokenRequestUrl, tokenPostData); var token = JsonConvert.DeserializeObject<AzulAccessToken>(tokenResponse); logger.Information(new ApiRequestEvent() { EventType = LogEventType.RefreshAzulTokenComplete, Message = $"Refresh api token succeed, token:{token.AccessToken}" }); redisUtils.SetAzulApiToken(token.AccessToken); logger.Information(new ApiRequestEvent() { EventType = LogEventType.RefreshAzulTokenComplete, Message = $"Save token into Redis succeed, token:{redisUtils.GetAzulApiToken()}" }); } catch (Exception ex) { logger.Error(new ExceptionEvent() { EventType = LogEventType.RefreshAzulTokenError, Message = $"Refresh Azul api token failed.", Exception = ex, }); } } }
2.建立另一个类,这个类继承Quartz中的IJob,调用上面业务逻辑的方法:ui
public class RefreshAzulTokenJob : IJob { public async Task Execute(IJobExecutionContext context) { await RefreshAzulToken.Excutor(); } }
这样一个简单的Task Job 就建立好了,RefreshAzulTokenJob 就是第一步里面建立Job的参数。.net
在应用程序的starup.cs里,启动这个Scheduler Task:code
TaskScheduler().Scheduler().GetAwaiter().GetResult();