官網: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();