前言 官網:https://www.quartz scheduler.net/ 一款開源的任務定時器。 日常有很多地方需要定時刷新的,比如微信開發中的微信API token,或者定時清理一下緩存數據等,應用場景還是比較常見。 接下來介紹一下這個簡單好用的庫。 引用 在Nuget管理中添加引用: Qu ...
前言
官網:https://www.quartz-scheduler.net/ 一款開源的任務定時器。
日常有很多地方需要定時刷新的,比如微信開發中的微信API token,或者定時清理一下緩存數據等,應用場景還是比較常見。
接下來介紹一下這個簡單好用的庫。
引用
在Nuget管理中添加引用: Quartz.dll
命名空間:
using Quartz;
using Quartz.Impl;
寫一個Task
實現一個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時間。
Job實現
1.創建一個類,用來處理這個任務的業務邏輯,比如這個刷新token:
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,調用上面業務邏輯的方法:
public class RefreshAzulTokenJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
await RefreshAzulToken.Excutor();
}
}
這樣一個簡單的Task Job 就創建好了,RefreshAzulTokenJob 就是第一步裡面創建Job的參數。
Job啟動
在應用程式的starup.cs里,啟動這個Scheduler Task:
TaskScheduler().Scheduler().GetAwaiter().GetResult();